我正在看一个由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;
}
答案 0 :(得分:9)
他添加'W'
的原因是他简化了这个表达式:
*str=x+(x>9? ('a'-10) :'0');
他发现'W'
是'a'-10
,并将简化常量输入到他的代码中。这不是一个好主意,因为如果不查看ASCII表,很难理解发生了什么。此外,编译器无论如何都将'a'-10
表达式简化为相同的精确值,因此可读性丢失,没有任何特定的增益。
答案 1 :(得分: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