C++ 将二进制编码十进制(BCD)解码为无符号整数
我的项目中使用的值用4位二进制编码小数(BCD)表示,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; 然
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”。