将二进制编码的十进制数(BCD)解码为无符号整数

6
在我的项目中使用的值是用4位二进制编码十进制(BCD)表示的,最初存储在字符缓冲区中(例如,由指针const unsigned char *指向)。我想将输入的BCD字符流转换为整数。请问您有什么有效和快速的方法吗?
数据格式示例及预期结果:
BCD*2; 1001 0111 0110 0101=9765
       "9"  "7"  "6"  "5"

非常感谢您!

2
可能是将BCD转换为二进制的最有效方法的重复问题。 - Bo Persson
@Bo Persson:那是C#的帖子,不是C++。 - forsvarir
@forsvarir:对于如何解决这个问题的一般原则,C# 的解决方案和其他语言一样有效。然而,我认为我的解决方案可能比该线程中的任何一个更加简洁。 :-) - C. K. Young
2个回答

8
unsigned int lulz(unsigned char const* nybbles, size_t length)
{
    unsigned int result(0);
    while (length--) {
        result = result * 100 + (*nybbles >> 4) * 10 + (*nybbles & 15);
        ++nybbles;
    }
    return result;
}

length在这里指定了输入的字节数,所以对于OP给出的例子,nybbles将是{0x97, 0x65},而length将是2。


非常感谢Chris Jester-Young。我将你的解决方案与我的进行了比较。你的解决方案更快。我在while循环中使用了“pow”。 - Golden Lee

5
您可以这样解读最右侧的数字:
const unsigned int bcdDigit = bcdNumber & 0xf;

然后您可以将数字向右移,这样下一个数字就成为了最右边的数字:
bcdNumber >>= 4;

然而这样可以把数字按照错误的顺序呈现(从右到左)。如果您知道有多少个数字,您当然可以直接提取正确的位。

使用例如(bcdNumber >> (4 * digitIndex)) & 0xf;来提取第digitIndex位数字,其中数字0是最右侧的。


亲爱的unwind,<br/>感谢您的快速回复。我的转换函数模板应该是这样<br/>unsigned int BCDn( unsigned int n, const unsigned char * data )<br/>其中"const unsigned char *"是指向4位二进制编码十进制字符缓冲区的指针。例如:<br/>const unsigned char * data = "1001011101100101";<br/> - Golden Lee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接