【问题标题】:Decode binary coded decimal (BCD) to unsigned integer将二进制编码的十进制 (BCD) 解码为无符号整数
【发布时间】:2011-05-26 11:54:57
【问题描述】:

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

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

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

非常感谢!

【问题讨论】:

  • @Bo Persson:用 C# 而非 C++ 发帖
  • @forsvarir:对于如何进行此操作的一般原则,C# 解决方案与其他解决方案一样好。但是,我认为我的解决方案可能比该线程中的任何解决方案都更紧凑。 :-)

标签: c++ bcd


【解决方案1】:
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”。
【解决方案2】:

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

const unsigned int bcdDigit = bcdNumber & 0xf;

然后你可以把数字右移,这样下一个数字就变成最右边了:

bcdNumber >>= 4;

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

使用例如(bcdNumber >> (4 * digitIndex)) & 0xf; 提取digitIndex:th 数字,其中数字 0 是最右边的。

【讨论】:

  • 亲爱的 unwind,
    感谢您的快速回复。我的转换函数模板应该像这样
    unsigned int BCDn( unsigned int n, const unsigned char * data )
    其中“const unsigned char *”是一个指向 4 位二进制编码小数的字符缓冲区的指针.例如:
    const unsigned char * data = "1001011101100101";
猜你喜欢
  • 2012-07-25
  • 1970-01-01
  • 2014-02-13
  • 2010-10-03
  • 2011-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多