1

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

更新

如果我没记错的话,我需要的是所谓的打包 BCD。我已经在进行 int 到 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;
}
4

2 回答 2

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)..就是这样

于 2012-05-23T21:22:09.623 回答
0

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

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

于 2012-05-24T12:52:05.987 回答