首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BCD到Ascii和Ascii到BCD

BCD到Ascii和Ascii到BCD
EN

Stack Overflow用户
提问于 2016-01-19 03:15:54
回答 3查看 10.7K关注 0票数 1

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

代码语言:javascript
复制
void BCD_Ascii(unsigned char src, char *dest) {
         outputs = "0123456789"
        *dest++ = outputs[src>>4];
        *dest++ = outputs[src&0xf];
        *dest = '\0';
    }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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.

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

关于您的第二个问题:反向方法可能如下所示:

代码语言:javascript
复制
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值。

票数 1
EN

Stack Overflow用户

发布于 2016-01-19 03:21:13

此函数用于将二进制编码的十进制字符转换为字符串。

首先获得src的高4位:

代码语言:javascript
复制
src>>4

然后,该函数假定这些位表示的值在0-9范围内。然后,该值用于获取字符串文字outputs中的索引

代码语言:javascript
复制
outputs[src>>4]; 

该值被写入dest指向的地址中。然后,该指针递增。

代码语言:javascript
复制
*dest++ = outputs[src>>4];

然后使用src的低4位:

代码语言:javascript
复制
 src&0xf

再次假设这些位的值表示0-9范围内的值。其余部分与之前相同:

代码语言:javascript
复制
*dest++ = outputs[src&0xf];

最后,在dest中写入0以终止它。

票数 1
EN

Stack Overflow用户

发布于 2016-01-19 03:25:17

相反的功能可以是:

代码语言:javascript
复制
BYTE ASC_BCD( char * asc )
{
  return (BYTE)( ( asc[0] & 15 ) << 4 ) | ( asc[1] & 15 );
}

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34862346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档