我正在尝试将BCD转换为ascii,反之亦然,我在浏览时看到了类似于此的解决方案,但没有完全理解。有人能解释一下吗?
void BCD_Ascii(unsigned char src, char *dest) {
outputs = "0123456789"
*dest++ = outputs[src>>4];
*dest++ = outputs[src&0xf];
*dest = '\0';
}发布于 2016-01-19 03:50:16
关于你的第一个问题:解释方法:
src>>4的看法是对的,它将字符值向右移动了4位,这意味着它返回的是更高的十六进制数字的值。例如,如果src为'\30',则src>>3将评估为3,或者'\3'.src&0xf通过ANDing获得较低的十六进制数字。带有0xF的src值是二进制值1111 (而不是11111111)。例如,如果src为'\46',则src&0xf的计算结果为6。在尝试理解该方法时,这里有两个重要的注意事项:
src First:当src有两个数字大于9时,该方法不能处理输入。例如,如果src等于buffer.
关于您的第二个问题:反向方法可能如下所示:
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值。
发布于 2016-01-19 03:21:13
此函数用于将二进制编码的十进制字符转换为字符串。
首先获得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];最后,在dest中写入0以终止它。
发布于 2016-01-19 03:25:17
相反的功能可以是:
BYTE ASC_BCD( char * asc )
{
return (BYTE)( ( asc[0] & 15 ) << 4 ) | ( asc[1] & 15 );
}可以使用& 15或& 0x0F将字符代码'0'..'9'转换为十六进制。然后使用shift键和|键进行组合。
https://stackoverflow.com/questions/34862346
复制相似问题