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值。
我正在尝试将 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值。