Convertir le contenu d'un objet NSString en représenation Hexa

remoozremooz Membre
03:30 modifié dans API AppKit #1
Voici mon problème.

Je dispose d'un UITextField dont le contenu est récupéré dans un objet NSString.
Je souhaite que cette valeur récupérée soit directement une réprésentation hexadécimale et pas une conversion dans la table ASCII.

Par exemple si je tape "F". Je voudrais obtenir "0x0F" et pas "46" (valeur hexa dans la table ASCII).
Merci par avance.

Réponses

  • Philippe49Philippe49 Membre
    03:30 modifié #2
    C'est un problème de C

    #include <stdio.h>

    int main(void) {
    char string[]="AF08";
    int N;
    sscanf(string,"%x",&N);
    sprintf(string,"%4x",N);
    puts(string);
    return 0;
    }

  • Philippe49Philippe49 Membre
    03:30 modifié #3
    Pour une NSString, tu convertis d'abord en char * avec UTF8String

    ....

  • remoozremooz Membre
    03:30 modifié #4
    C'est ce que je fais
    c_buffer = [string UTF8String];
    


    Mais il me retourne la valeur décimale du caractère entré.
  • Philippe49Philippe49 Membre
    octobre 2008 modifié #5
    enchaà®ne avec le code que je t'ai donné
    int N;
    sscanf(c_buffer,"%x",&N);    // Le format %x lit le texte comme un hexa, et l'affecte à  N
    NSString * newString=[NSString stringWithFormat:@%x,N];
  • remoozremooz Membre
    03:30 modifié #6
    Ca ne fonctionne pas. Je met le code peut-être que ça t'aidera.

    <br />const char *uc_buffer;<br />unsigned int ui_length;<br />unsigned short us_result;<br />NSString *string;<br /><br />// Store the text of the text field in the &#39;string&#39; instance variable.<br />string = textField.text;<br /><br />// Convert the string into a C-string<br />uc_buffer = [string UTF8String];<br /><br />us_result = [toto calcul:uc_buffer with:ui_length];
    


    ma string peut ressembler aussi bien à  "FF" ou encore à  "100FAEB59A".
  • Philippe49Philippe49 Membre
    03:30 modifié #7
    dans 1223743874:

    Ca ne fonctionne pas. Je met le code peut-être que ça t'aidera.

    <br />const char *uc_buffer;<br />unsigned int ui_length;<br />unsigned short us_result;<br />NSString *string;<br /><br />// Store the text of the text field in the &#39;string&#39; instance variable.<br />string = textField.text;<br /><br />// Convert the string into a C-string<br />uc_buffer = [string UTF8String];<br /><br />us_result = [toto calcul:uc_buffer with:ui_length];
    


    ma string peut ressembler aussi bien à  "FF" ou encore à  "100FAEB59A".



    Un unsigned short se code sur 2 octets. Ainsi en aucun cas ton mot uc_buffer ne peut dépasser 4 caractères hexadécimaux. L'hypothèse du mot  "100FAEB59A" n'est donc acceptable qu'en ne prenant que les 4 premiers caractères de ce mot au maximum.

    Question
    Tu rentres une chaà®ne de longueur quelconque uc_buffer,
    Tu te donnes un entier ui_length≤4
    Tu veux pouvoir lire les ui_length premiers caractères comme le code hexa d'un unsigned short.

    C'est ça ?
  • remoozremooz Membre
    03:30 modifié #8
    uc_buffer est un pointeur ce qui est équivalent à  un tableau dont la taille n'est pas définie.

    concernant ui_length. Je cherche à  calculer la taille de mon tableau uc_buffer.
  • Philippe49Philippe49 Membre
    03:30 modifié #9
    dans 1223745450:

    concernant ui_length. Je cherche à  calculer la taille de mon tableau uc_buffer.


    ben
    ui_length=strlen(uc_buffer)
  • remoozremooz Membre
    03:30 modifié #10
    C'est pas ça le problème, j'y arrive très bien avec
    ui_length = string.length;
    

    Ce que je veux c'est que quand je tape "FF" dans mon champ de texte j'ai en mémoire 0xFF et pas le valeur hexa du caractère "F".
  • Philippe49Philippe49 Membre
    octobre 2008 modifié #11
    dans 1223745875:

    Ce que je veux c'est que quand je tape "FF" dans mon champ de texte j'ai en mémoire 0xFF et pas le valeur hexa du caractère "F".

    Tu veux donc remplacer 'F' par 'F' - 'A'+10, '9' par '9'-'0', 'b' par 'b'-'a'+10.
    Pour cela il faut faire une boucle sur tous les caractères de uc_buffer, et leur appliquer le traitement de translation ci-dessus.

    Ceci dit si après tu veux les regrouper en lecture deux par deux (lire en short), il faut tenir compte de l'endianness, et par exemple faire une interversion d'octet tous les 2 caractères.

    Par contre je ne vois vraiment pas ce que tu veux en faire ...

  • schlumschlum Membre
    03:30 modifié #12
    unsigned long long convertStringToLongLong(NSString *s)<br />{<br />	const char *c = [s UTF8String];<br />	int lg = [s lengthOfBytesUsingEncoding:NSUTF8StringEncoding];<br />	unsigned long long res = 0;<br />	int i;<br />	for(i=0;i&lt;lg;++i) {<br />		res *= 16;<br />		if(c[i]&gt;=&#39;0&#39;&amp;&amp;c[i]&lt;=&#39;9&#39;)<br />			res += c[i]-&#39;0&#39;;<br />		else if(c[i]&gt;=&#39;A&#39;&amp;&amp;c[i]&lt;=&#39;F&#39;)<br />			res += c[i]-&#39;A&#39;+10;<br />		else if(c[i]&gt;=&#39;a&#39;&amp;&amp;c[i]&lt;=&#39;f&#39;)<br />			res += c[i]-&#39;a&#39;+10;<br />		else<br />			[[NSException exceptionWithName:@&quot;Bad char in string&quot;<br />									 reason:@&quot;Char in string is not in range [0-9A-Fa-f]&quot;<br />								&nbsp; &nbsp;userInfo:nil] raise];<br />	}<br />	return res;<br />}
    

  • gifagifa Membre
    03:30 modifié #13
    -(NSString*) EcritureEEPromI2C:(NSString*)inst2
    {
    unsigned nbOctets = [inst2 length];

    unsigned donneesHEXA;
    NSScanner *scan;
    int i, okHex;
    for(i=0; i < nbOctets; i++)
    {
    scan=[NSScanner scannerWithString:[inst2 substringWithRange:NSMakeRange(i,1)]];
    okHex=[scan scanHexInt:&donneesHEXA];
    if (okHex == 0) return @\nERREUR: Caractère pas hexa;
    }
    for(i=0; i < nbOctets/2; i++)
    {
    scan=[NSScanner scannerWithString:[inst2 substringWithRange:NSMakeRange(i*2,2)]];
    okHex=okHex+[scan scanHexInt:&donneesHEXA];
    envoye_buf[5+i] = (unsigned char) (donneesHEXA);
    }

  • Philippe49Philippe49 Membre
    octobre 2008 modifié #14
    Et si c'est remplacer deux caractères par un seul que tu veux faire, genre

    Les 10 octets "AF0812BC1A"    deviennent  5 octets 0xAF 0x08 0x12 0xBC 0x1A

    voici de quoi faire :

    #include &lt;stdio.h&gt;<br />#include &lt;ctype.h&gt;<br />#define INTVALUE(c) (isdigit(c)? (c)-&#39;0&#39;: tolower(c)-&#39;a&#39;+10)<br /><br />int main(void) {<br />	char src&#91;]=&quot;AF0812BC1A&quot;;<br />	int i=0;<br />	for(i=0;i&lt;10;i+=2){<br />		if(isxdigit(src[i]) &amp;&amp; isxdigit(src[i+1])) {<br />			unsigned char digramme=16*INTVALUE(src[i])+INTVALUE(src[i+1]); <br />			printf(&quot;%d codé par l&#39;octet &#092;t%#02x&#092;n&quot;,digramme,digramme);<br />		} else {<br />			printf(&quot;Erreur&#092;n&quot;);<br />		}		<br />	}	<br />	return 0;<br />}
    




    % pgm
    175 codé par l'octet 0xaf
    8 codé par l'octet     0x8
    18 codé par l'octet 0x12
    188 codé par l'octet 0xbc
    26 codé par l'octet 0x1a
    %


  • gifagifa Membre
    03:30 modifié #15
    Je par d'un objet NSString que je tranforme en hexa pour écrire dans une mémoire d'un microcontroleur
  • remoozremooz Membre
    03:30 modifié #16
    voilà  c'est exactement ce que je souhaite avoir comme résultat 
  • psychoh13psychoh13 Mothership Developer Membre
    03:30 modifié #17
    3 lignes :
    unsigned val = 0;<br />[[NSScanner scannerWithString:@&quot;0xF&quot;] scanHexInt:&amp;val];<br />NSLog(@&quot;%u&quot;, val);
    


    Pour une fois que NSScanner est utile. :)
  • AliGatorAliGator Membre, Modérateur
    03:30 modifié #18
    Heu ça c'est pour le travail dans l'autre sens, tu demandes d'interpréter 0xFF comme chaà®ne hexa et récupérer le résultat en entier.
    Mais heu je suis pas sûr que ça colle avec ce qui est demandé, si ? Je pensais que c'était le sens inverse...
Connectez-vous ou Inscrivez-vous pour répondre.