首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# Byte[] to BCD和BCD to INT

C# Byte[] to BCD和BCD to INT
EN

Stack Overflow用户
提问于 2012-07-28 12:30:15
回答 5查看 29.8K关注 0票数 5

我有一个由CashRegister机器创建的十六进制文件。我得把这份文件读进去。

文件使用格式设置,详见下文。就像套接字包。

代码数据:2字节

PLU代码数据:7 Byte

单位价格数据:5字节

数量数据:5字节

总额数据:5字节

PLU名称数据: 18位

税率数据:1字节

长度: 24 + 19字节

  • PLU代码格式是BCD。
  • 单价1-9999999999 (BCD)
  • 数量1-9999999999 (BCD最后3个数字应该是十进制)
  • 总额1-9999999999 (BCD)

我用二进制读取器读取十六进制文件,然后插入Unit Price字节数组。

代码语言:javascript
复制
byte[] bytes = { data[21], data[22], data[23], data[24], data[25] }; // BCD Byte Array

这个数组是单位价格。但是我怎样才能把这个数字转换成十进制。信息显示,对于数量,BCD的最后一个数应该是十进制--这意味着什么?谢谢。

EN

回答 5

Stack Overflow用户

发布于 2012-07-28 13:03:19

BCD数字将0-9的值编码为4位.在打包BCD (可能是您正在处理的东西)中,一个字节用于包含两个值0-9,每个字节中有一个(4位)。要转换为int,您必须稍微修改一下。例如,下面将BCD字节数组转换为int,它最多可容纳9位数字。如果输入的bcd数超过9位,请使用long。

代码语言:javascript
复制
// 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循环中的转换代码将是

代码语言:javascript
复制
    result *= 100;
    result += (10 * (bcd & 0xf));
    result += bcd >> 4;

还需要确保数组具有正确的endianness,即数组中的第一个字节是否包含最重要的两位数字,或者最小的两位数。例如,使用打包的BCD,数字123456可以容纳3个字节。12是字节还是byte2?如果您的endianness与我的假设不同,则需要调整上面的循环以逆转顺序。我假设12是字节0

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

票数 10
EN

Stack Overflow用户

发布于 2012-07-28 13:20:20

每个字节是两个十进制数字,每个小数点中有一个。如果将字节显示为十六进制,则可以轻松读取数字。

代码语言:javascript
复制
0x08 0x27 0x42 0x17 0x75 = 827,421,775

你可以得到像这样的高低小吃:

代码语言:javascript
复制
int high = currentByte >> 4;
int low = currentByte & 0xF;

将每个字节转换为数字如下:

代码语言:javascript
复制
int number = 10 * high + low;

但是请记住,每个字节比下一个字节大100倍。

如果数量有3位小数点,只需将最后的数字除以1,000,即可得到实际值。

票数 5
EN

Stack Overflow用户

发布于 2014-01-31 11:53:34

正确代码:

代码语言:javascript
复制
// assume byte[] bcds is input
int result = 0;
foreach(byte bcd in bcds) {
    result *= 100;
    result += (10 * (bcd >> 4));
    result += bcd & 0xf;
}

还可以通过创建公共静态类来创建byte[]的自定义扩展:

代码语言:javascript
复制
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);

    }
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11701043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档