如何在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;
}
答案 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
0011
是3
。那是因为小数点在左边3个位置。
就你的功能而言,只需选择最右边的4位并保存以供日后使用。然后正常运行您的功能。然后将保存的右4位转换为十进制数。然后除以(10*number)
..就是这样
答案 1 :(得分:0)
不确定如何处理这个问题,但这是我发现的:
由于协议文档很糟糕,我搜索了一些旧代码并发现即使其他数据被编码为BCD的证据,浮点数也不是。所以,BitConverter.GetBytes会做我需要的。