BCD到Ascii和Ascii到BCD

时间:2016-01-18 19:15:54

标签: c bcd

我试图将BCD转换为ascii,反之亦然,并在浏览时看到类似于此的解决方案,但并不完全理解它。有人可以解释一下吗?

ProxyPassReverse

3 个答案:

答案 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值。