gpt4 book ai didi

C# Byte[] 到 BCD 和 BCD 到 INT

转载 作者:太空狗 更新时间:2023-10-29 22:09:33 24 4
gpt4 key购买 nike

我有一个由 CashRegister Machine 创建的 Hex 文件。我必须读入这个文件。

文件使用下面详述的格式。它就像套接字数据包。

代码数据:2字节
PLU码数据:7字节
单价数据:5字节
数量数据:5字节
数据总量:5字节
PLU名称数据:18字节
税率数据:1字节
长度:24 + 19 字节

  • PLU码格式为BCD
  • 单价1-9999999999(BCD)
  • 数量1-9999999999(BCD后3位必须是十进制)
  • 总金额1-9999999999(BCD)

我用二进制阅读器读入十六进制文件,然后插入单价字节数组。

byte[] bytes = { data[21], data[22], data[23], data[24], data[25] }; // BCD Byte Array

这个数组是单价。但是我怎样才能将这个数字转换为十进制。并且信息说对于数量:BCD 最后一个数字应该是十进制——这是什么意思?谢谢。

最佳答案

BCD 数字将 0-9 的值编码为 4 位。在打包的 BCD 中(可能是您正在处理的),一个字节用于包含两个值 0-9,一个在字节的每个半字节(4 位)中。要转换为 int,您必须做一些摆弄。例如,以下将 BCD 字节数组转换为 int,最多可容纳 9 位数字。如果输入超过 9 个 bcd 数字,请使用 long。

// assume byte[] bcds is input
int result = 0;
foreach(byte bcd in bcds) {
result *= 100;
result += (10 * (bcd >> 4));
result += bcd & 0xf;
}

这假设每个字节都存储为 big-endian BCD,其中最重要的数字位于字节的最重要的半字节中。这就是 Wikipedia page for BCD 中描述的更常见的实现。如果您正在处理小端 BCD,for 循环中的转换代码将是

    result *= 100;
result += (10 * (bcd & 0xf));
result += bcd >> 4;

您还需要确保数组的字节顺序正确,即数组中的第一个字节包含最高有效两位数还是最低有效两位数。例如,数字 123456 使用压缩 BCD 可以放入 3 个字节。 12是byte[0]还是byte[2]?如果您的字节顺序与我的假设不同,您将需要调整上面的循环以反转顺序。我假设 12 在 byte[0] 中(big endian,最左边的字节中有最重要的数字)。

至于 BCD 和十进制描述的数量,我需要查看实际值才能理解他们在说什么。

关于C# Byte[] 到 BCD 和 BCD 到 INT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11701043/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com