3

我正在查看一个由 Tibor Kiss 创建的简单 C 函数(链接如下)。我试图了解如何将单个二进制字节转换为两个十六进制字符涉及添加“W”(0x57)。为什么要这样做?

我知道 >> 将字符 c 向右移动了四个位置(用 0 填充左侧位)。我也理解 x=c&0x0f 部分,它只是使用按位与屏蔽 x 的高四位。

我只是不知道为什么将二进制字节转换为十六进制会涉及添加 ASCII 'W' (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;
}
4

2 回答 2

9

他补充的原因'W'是他简化了这个表达式:

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

他观察到'W''a'-10,并将简化的常数输入到他的代码中。这不是一个好主意,因为如果不查看 ASCII 表就很难理解发生了什么。此外,编译器无论如何都会将表达式简化为'a'-10相同的精确值,因此失去了可读性,没有任何特别的好处。

于 2013-08-11T21:44:13.400 回答
0

如果 c 是 ( H1H2H3H4L1L2L3L4) ,str[0] 有0000H1H2H3H4,而 str[1] 有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

所以他只是转身

                0x12 to '1''2'0
                0xAB to 'a''b'0
于 2013-08-11T22:43:55.290 回答