我试图将BCD转换为ascii,反之亦然,并在浏览时看到类似于此的解决方案,但并不完全理解它。有人可以解释一下吗?
ProxyPassReverse
答案 0 :(得分:1)
该函数将二进制编码的十进制字符转换为字符串。
首先获得src
的高4位:
src>>4
该函数假设这些位表示的值在0-9范围内。然后该值用于获取字符串文字outputs
中的索引:
outputs[src>>4];
该值写入dest
指向的地址。然后递增此指针。
*dest++ = outputs[src>>4];
然后使用src
的低4位:
src&0xf
再次假设这些位的值表示0-9范围内的值。其余的和以前一样:
*dest++ = outputs[src&0xf];
最后将0写入dest
,以终止它。
答案 1 :(得分:1)
相反的功能可以是:
BYTE ASC_BCD( char * asc )
{
return (BYTE)( ( asc[0] & 15 ) << 4 ) | ( asc[1] & 15 );
}
可以使用'0'..'9'
或& 15
将字符代码& 0x0F
转换为十六进制。然后转换并|
合并。
答案 2 :(得分:1)
关于您的第一个问题:解释方法:
你对src>>4
是正确的,这会将字符值4位向右移动,这意味着它将返回更高十六进制数字的值。
例如如果src
为'\30'
,则src>>3
将评估为3或'\3'
。
src&0xf
通过将src值与0xF进行AND运算得到十六进制数字,其中二进制值为1111(不是11111111)。例如如果src
为'\46'
,那么src&0xf
将评估为6。
在尝试理解该方法时,有两个重要的注意事项:
首先:当src有两个数字高于9时,该方法无法处理输入。例如,如果src等于'\3F'
,则该方法将溢出缓冲区。
第二:请注意,此方法会在字符串中的某个位置添加两位数字符,然后终止字符串。调用程序逻辑应负责位置的位置,递增指针,并确保输出缓冲区在输入指针位置之后允许三个字符(至少)。
关于你的第二个问题: 反向方法可以如下:
unsigned char Ascii_BCD(const char* src) {
return (unsigned char)((src[0] - 0x30) * 0x10 + src[1] - 0x30);
}
[编辑:向反向方法添加说明]
位置0和1的两个ASCII数字减去0x30或'0',以便从ascii转换为二进制。例如。数字'4'由ascii代码0x34表示,因此减去0x30将评估为4。
然后将较高的第一个数字乘以0x10,将值向左移动4位。
添加两个值以组成BCD值。