Convertit deux caractères hexadécimaux ASCII (deux octets ASCII) en un octet

Je veux convertir deux octets ASCII en un octet hexadécimal. par exemple.

0x30 0x43 => 0x0C , 0x34 0x46 => 0x4F

Les octets ASCII sont un nombre compris entre 0 et 9 ou une lettre entre A et F (majuscules uniquement), donc entre 0x300x39 et 0x410x46

Je sais comment “construire” 0x4F avec les nombres 0x34 et 0x46 : 0x4F = 0x34 * 0x10 + 0x46

Donc, en fait, je voudrais convertir un octet ASCII en valeur hexadécimale.

Pour cela, je peux construire un tableau pour assigner la valeur hexadécimale au caractère ASCII:

 0x30 => 0x00 0x31 => 0x01 ... 0x46 => 0x0F 

Mais peut-être ont-ils une solution plus «appropriée».

Le programme sera exécuté sur un AVC µC et est compilé avec avr-gcc printf() solutions scanf() / printf() ne conviennent donc pas.

Avez-vous une idée? Merci

Je ne peux pas donner un sens à vos exemples, mais si vous voulez convertir une chaîne contenant des caractères ascii hexadécimaux en valeur d’octet (par exemple, la chaîne “56” devient l’octet 0x56, vous pouvez l’utiliser (ce qui suppose que votre système utilise ASCII)

 uint8_t* hex_decode(const char *in, size_t len,uint8_t *out) { unsigned int i, t, hn, ln; for (t = 0,i = 0; i < len; i+=2,++t) { hn = in[i] > '9' ? in[i] - 'A' + 10 : in[i] - '0'; ln = in[i+1] > '9' ? in[i+1] - 'A' + 10 : in[i+1] - '0'; out[t] = (hn << 4 ) | ln; } return out; } 

Vous l'utiliseriez comme par exemple

 char x[]="1234"; uint8_t res[2]; hex_decode(x,strlen(x),res); 

Et res (qui doit être au moins la moitié de la longueur du paramètre in ) contient maintenant les 2 octets 0x12,0x34

Notez également que ce code nécessite que les lettres hexadécimales AF soient majuscules. Af ne le fera pas (et il ne vérifie pas les erreurs - vous devrez donc lui transmettre des éléments valides).

Vous pouvez utiliser strtol() , qui fait partie de avr-libc , ou vous pouvez simplement écrire votre cas spécifique assez facilement:

 unsigned char charToHexDigit(char c) { if (c >= 'A') return c - 'A' + 10; else return c - '0'; } unsigned char ssortingngToByte(char c[2]) { return charToHexDigit(c[0]) * 16 + charToHexDigit(c[1]); } 

La tâche:

Convertissez une chaîne contenant des caractères ascii hexadécimaux en valeurs d’octet de sorte que "FF" devienne 0xFF et que "10" (x31x30x00) devienne 0x10

 char asciiSsortingng[]="aaAA12fF";// input ascii hex ssortingng char result[4]; // byte equivalent of the asciiSsortingng (the size should be at half of asciiSsortingng[]) 

// le résultat final devrait être:

 result[0] = 0xAA; result[1] = 0xAA; result[2] = 0x12; result[3] = 0xFF; 

//1. Première étape: convertissez asciiSsortingng afin qu’il ne contienne que des majuscules:

 // convert ssortingng to upper cases: ssortingngToUpperCases(asciiSsortingng); 

utilisation:

 void ssortingngToUpperCases(char *p) { for(int i=0; *(p+i) !='\0'; i++) { *(p+i) = (unsigned char) toupper( *(p+i) ); } } 

// 2. Convertit une chaîne contenant des caractères ascii hexadécimaux en valeurs d’octet:

 // convert ssortingng to bytes: int nrOfBytes = ssortingngToBytes(asciiSsortingng,result); //use: unsigned char charToHexDigit(char c) { if (c >= 'A') return (c - 'A' + 10); else return (c - '0'); } unsigned char ascii2HexToByte(char *ptr) { return charToHexDigit( *ptr )*16 + charToHexDigit( *(ptr+1) ); } int ssortingngToBytes(char *ssortingng, char *result) { int k=0; int strLen = strlen(ssortingng); for(int i = 0; i < strLen; i = i + 2) { result[k] = ascii2HexToByte( &string[i] ); k++; } return k; // number of bytes in the result array } 

// 3. résultat d'impression:

 printNrOfBytes(nrOfBytes, result); 

// utilisation:

 void printNrOfBytes(int nr, char *p) { for(int i= 0; i < nr; i++) { printf( "0x%02X ", (unsigned char)*(p+i) ); } printf( "\n"); } 

// 4. Le résultat devrait être:

0xAA 0xAA 0x12 0xFF

// 5. C'est le programme de test:

 char asciiSsortingng[]="aaAA12fF"; // input ascii hex ssortingng char result[4]; // result // convert ssortingng to upper cases: ssortingngToUpperCases(asciiSsortingng); // convert ssortingng to bytes int nrOfBytes = ssortingngToBytes(asciiSsortingng,result); // print result: printNrOfBytes(nrOfBytes, result); // result: // 0xAA 0xAA 0x12 0xFF 

Cela fonctionne, mais pourrait être beaucoup optimisé!

 inline uint8_t twoAsciiByteToByte(const std::ssortingng& s) { uint8_t r = 0; if (s.length() == 4) { uint8_t a = asciiToByte(s[0]); uint8_t b = asciiToByte(s[1]); uint8_t c = asciiToByte(s[2]); uint8_t d = asciiToByte(s[3]); int h = (a * 10 + b); int l = (c * 10 + d); if (s[0] == '3') h -= 30; else if (s[0] == '4') h -= 31; if (s[2] == '3') l -= 30; else if (s[2] == '4') l -= 31; r = (h << 4) | l; } return r; }