我有一个由CashRegister机器创建的十六进制文件。我得把这份文件读进去。
文件使用格式设置,详见下文。就像套接字包。
代码数据:2字节
PLU代码数据:7 Byte
单位价格数据:5字节
数量数据:5字节
总额数据:5字节
PLU名称数据: 18位
税率数据:1字节
长度: 24 + 19字节
我用二进制读取器读取十六进制文件,然后插入Unit Price字节数组。
byte[] bytes = { data[21], data[22], data[23], data[24], data[25] }; // BCD Byte Array这个数组是单位价格。但是我怎样才能把这个数字转换成十进制。信息显示,对于数量,BCD的最后一个数应该是十进制--这意味着什么?谢谢。
发布于 2012-07-28 13:03:19
BCD数字将0-9的值编码为4位.在打包BCD (可能是您正在处理的东西)中,一个字节用于包含两个值0-9,每个字节中有一个(4位)。要转换为int,您必须稍微修改一下。例如,下面将BCD字节数组转换为int,它最多可容纳9位数字。如果输入的bcd数超过9位,请使用long。
// assume byte[] bcds is input
int result = 0;
foreach(byte bcd in bcds) {
result *= 100;
result += (10 * (bcd >> 4));
result += bcd & 0xf;
}这假设每个字节都存储为大端BCD,其中最重要的数字位于字节的最重要的小块中。这就是在BCD维基百科页面中描述的更常见的实现。如果您处理的是小端BCD,for循环中的转换代码将是
result *= 100;
result += (10 * (bcd & 0xf));
result += bcd >> 4;还需要确保数组具有正确的endianness,即数组中的第一个字节是否包含最重要的两位数字,或者最小的两位数。例如,使用打包的BCD,数字123456可以容纳3个字节。12是字节还是byte2?如果您的endianness与我的假设不同,则需要调整上面的循环以逆转顺序。我假设12是字节0。
至于被描述为BCD和十进制的数量,我需要看到实际的值,才能理解他们在说什么。
发布于 2012-07-28 13:20:20
每个字节是两个十进制数字,每个小数点中有一个。如果将字节显示为十六进制,则可以轻松读取数字。
0x08 0x27 0x42 0x17 0x75 = 827,421,775你可以得到像这样的高低小吃:
int high = currentByte >> 4;
int low = currentByte & 0xF;将每个字节转换为数字如下:
int number = 10 * high + low;但是请记住,每个字节比下一个字节大100倍。
如果数量有3位小数点,只需将最后的数字除以1,000,即可得到实际值。
发布于 2014-01-31 11:53:34
正确代码:
// assume byte[] bcds is input
int result = 0;
foreach(byte bcd in bcds) {
result *= 100;
result += (10 * (bcd >> 4));
result += bcd & 0xf;
}还可以通过创建公共静态类来创建byte[]的自定义扩展:
public static class BitConverterExtension
{
public static UInt64 FromBCDToExtUInt64(this byte[] b, byte[] bcds, uint nBytes, uint startOf)
{
UInt64 result = 0;
uint i = 0;
for (i = 0; i < nBytes; i++)
{
result *= 100;
result += (UInt64)(10 * (bcds[startOf + i] >> 4));
result += (UInt64)(bcds[startOf + i] & 0xf);
}
return (result);
}
}https://stackoverflow.com/questions/11701043
复制相似问题