如何将浮点数转换为BCD

时间:2012-05-23 17:59:00

标签: c# floating-point ieee-754 bcd

如何在C#中将正浮点数(ieee 754,单精度32位)转换为BCD?

更新

如果我没错,我需要的就是打包的BCD。我已经在进行BCD转换了。在我正在做的方式中,数字1234将导致以下字节数组:

{0x00, 0x00, 0x12, 0x34}

我使用的方法(可能不是最好的方法)是:

public byte[] ToBCD(long num) {
    long bcd = 0;
    int i = 0;
    while (num > 9) {
        bcd |= ((num % 10) << i);
        num /= 10;
        i += 4;
    }
    byte[] bytes = BitConverter.GetBytes(bcd | (num << i));
    Array.Reverse(bytes);
    return bytes;
}

2 个答案:

答案 0 :(得分:3)

BCD不是为存储浮点数而设计的。但是,您可以做的是对其进行编码并使用您自己的自定义BCD模式对其进行解码。例如,我会取你的数字并删除小数点。然后我将每个数字编码为BCD,就像正常一样。然后添加额外的4位以确定小数点应该去的位置。例如,要对数字15.101进行编码:

15.101 -> 15101 - 删除小数点

15101 -> 0001 0101 0001 0000 0001 - 转换为BCD

现在我们在末尾添加一个额外的4位来确定小数位:

0001 0101 0001 0000 0001 -> 0001 0101 0001 0000 0001 0011

00113。那是因为小数点在左边3个位置。

就你的功能而言,只需选择最右边的4位并保存以供日后使用。然后正常运行您的功能。然后将保存的右4位转换为十进制数。然后除以(10*number) ..就是这样

答案 1 :(得分:0)

不确定如何处理这个问题,但这是我发现的:

由于协议文档很糟糕,我搜索了一些旧代码并发现即使其他数据被编码为BCD的证据,浮点数也不是。所以,BitConverter.GetBytes会做我需要的。