C中的二进制字符到十六进制转换

JJB*_*ter 3 c string binary hex

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

我明白>>将字符c右移四个位置(用0表示填充左手位).我也理解x = c&0x0f部分,它只使用按位AND屏蔽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;
}
Run Code Online (Sandbox Code Playgroud)

das*_*ght 9

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

*str=x+(x>9? ('a'-10) :'0');
Run Code Online (Sandbox Code Playgroud)

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

  • @KeithNicholas我的意思是,''a' - 10`是一个constexpr.如果我的编译器没有将它优化为文字"0x57",我会立即将它弹出到外层空间. (2认同)