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

C++ 将二进制编码十进制(BCD)解码为无符号整数,c++,bcd,C++,Bcd,我的项目中使用的值用4位二进制编码小数(BCD)表示,BCD最初存储在字符缓冲区中(例如,由指针const unsigned char*指向)。我想将输入BCD字符流转换为整数。你能告诉我一个快速有效的方法吗 数据格式示例和预期结果: BCD*2; 1001 0111 0110 0101=9765 "9" "7" "6" "5" 多谢各位 您可以这样破译最右边的数字: const unsigned int bcdDigit = bcdNumber & 0xf; 然

我的项目中使用的值用4位二进制编码小数(BCD)表示,BCD最初存储在字符缓冲区中(例如,由指针
const unsigned char*
指向)。我想将输入BCD字符流转换为整数。你能告诉我一个快速有效的方法吗

数据格式示例和预期结果:

BCD*2; 1001 0111 0110 0101=9765
       "9"  "7"  "6"  "5"

多谢各位

您可以这样破译最右边的数字:

const unsigned int bcdDigit = bcdNumber & 0xf;
然后您可以将数字向右移动,以便下一个数字成为最右边的数字:

bcdNumber >>= 4;
这会给你错误的数字顺序(从右到左)。如果你知道你有多少位,你当然可以直接提取正确的位

使用例如
(bcdNumber>(4*digitIndex))&0xf
提取
数字索引
:第个数字,其中数字0是最右边的

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给出的示例,
nybles
将是
{0x97,0x65}
length
将是2。

可能重复的@Bo Persson:以C#而不是C++@forsvarir:关于如何进行此操作的一般原则,C#解决方案和其他解决方案一样好。但是,我认为我的解决方案可能比该线程中的任何解决方案都更紧凑。:-)亲爱的放松者,
感谢您的快速回复。我的转换函数模板应该是这样的
unsigned int BCDn(unsigned int n,const unsigned char*data)
其中“const unsigned char*”是指向4位二进制编码小数的字符缓冲区的指针。例如:
const unsigned char*data=“1001011101100101”
非常感谢Chris Jester Young。我把你的解决方案和我的做了比较。您的解决方案更快。我在while循环中使用了“pow”。