3 votes

Conversion de caractères binaires en caractères hexagonaux en C

Je me penche sur une simple fonction C créée par Tibor Kiss (lien ci-dessous). J'essaie de comprendre comment la conversion d'un seul octet binaire en deux caractères hexadécimaux implique l'ajout de "W" (0x57). Pourquoi cela se fait-il ?

Je comprends que >> décale le caractère c vers la droite de quatre places (en remplissant les bits de gauche par des 0). Je comprends également la partie x=c&0x0f qui masque simplement les quatre bits supérieurs de x à l'aide d'un ET bit à bit.

Je ne comprends pas pourquoi la conversion d'un octet binaire en hexadécimal implique l'ajout d'un "W" ASCII (0x57).

http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en543105

/******************************************************************************
 * Function:        void btoh(unsigned char c,char *str)
 *
 * PreCondition:    None
 *
 * Input:           str - pointer to the zero terminated string
 *                  c   - byte to convert
 *
 * Output:          None
 *
 * Side Effects:    None
 *
 * Overview:        Convert one byte to a 2 character length hexadecimal
 *                  zero terminated string
 *
 * Note:            Using static variable for less code size
 *****************************************************************************/
void btoh(unsigned char c,char *str)
{
    static unsigned char x;
    x=c>>4;
    *str=x+(x>9?'W':'0');
    x=c&0x0f;
    str[1]=x+(x>9?'W':'0');
    str[2]=0;
}

9voto

dasblinkenlight Points 264350

La raison pour laquelle il ajoute 'W' est qu'il a simplifié cette expression :

*str=x+(x>9? ('a'-10) :'0');

Il a observé que 'W' es 'a'-10 et a entré la constante simplifiée dans son code. Ce n'est pas une très bonne idée, car il est difficile de comprendre ce qui se passe sans regarder la table ASCII. De plus, le compilateur simplifie le 'a'-10 à la même valeur exacte de toute façon, donc la lisibilité est perdue sans gain particulier d'aucune sorte.

0voto

Lidong Guo Points 2767

Si c est ( H1H2H3H4L1L2L3L4 ) ,str[0] a le 0000H1H2H3H4 et str[1] a 0000L1L2L3L4

+ '0'                                             ANSI

0000 0*** + 0011 0000 = 0011 0****  0  -->  0x30   0
                                    1  -->  0x31   1
                                    2  -->  0x32   2
                                       ...
+'W'                                               ANSI
00001011 + 0101 0111 =  0110 0010   B  -->  0x62  -->b
00001100 + 0101 0111 =  0110 0011   C  -->  0x63  -->c
00001010 + 0101 0111 =  0110 0001   A  -->  0x61  -->a
00001101 + 0101 0111 =  0110 0100   D  -->  0x64  -->d
00001111 + 0101 0111 =  0110 0110   F  -->  0x66  -->f
00001110 + 0101 0111 =  0110 0101   E  -->  0x65  -->e

Alors il a juste tourné

                0x12 to '1''2'0
                0xAB to 'a''b'0

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X