BCD转Ascii和Ascii转BCD

BCD to Ascii and Ascii to BCD

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

void BCD_Ascii(unsigned char src, char *dest) {
         outputs = "0123456789"
        *dest++ = outputs[src>>4];
        *dest++ = outputs[src&0xf];
        *dest = '[=10=]';
    }

函数将binary-coded十进制的字符转换为字符串。

首先得到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,结束

相反的函数可以是:

BYTE ASC_BCD( char * asc )
{
  return (BYTE)( ( asc[0] & 15 ) << 4 ) | ( asc[1] & 15 );
}

字符代码 '0'..'9' 可以用 & 15& 0x0F 转换为十六进制。然后进行shift和|合并。

关于你的第一个问题:解释方法:

  • 关于 src>>4 你是对的,这会将字符值向右移动 4 位,这意味着它返回较高的十六进制数字的值。 例如如果 src'' 那么 src>>3 将计算为 3 或 ''.

  • src&0xf 通过将 src 值与 0xF 与二进制值 1111(不是 11111111)进行与操作来获取较低的十六进制数字。例如如果 src'' 那么 src&0xf 将计算为 6.

在尝试理解该方法时,这里有两个重要注意事项:

  • 首先:当 src 有大于 9 的两位数字时,该方法无法处理输入。即如果 src 等于 'F',例如,该方法将溢出缓冲区。

  • 其次:请注意,此方法将字符串中某个位置的两位数字字符相加,然后终止字符串。调用者逻辑应该负责位置在哪里,递增指针,并确保输出缓冲区在输入指针位置之后允许三个字符(至少)。

关于你的第二个问题: 反向方法如下:

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