将Int转换为BCD字节数组

Kin*_*pin 6 .net c# bytearray bcd

我想使用BCD将int转换为byte [4]数组.

有问题的int将来自设备ID,他需要通过serialport与设备通话.

是否有任何预制功能可以做到这一点,或者你能给我一个简单的方法吗?

例:

int id= 29068082
Run Code Online (Sandbox Code Playgroud)

输出:

byte[4]{0x82, 0x80, 0x06, 0x29};
Run Code Online (Sandbox Code Playgroud)

Pet*_* O. 8

使用此方法.

    public static byte[] ToBcd(int value){
        if(value<0 || value>99999999)
            throw new ArgumentOutOfRangeException("value");
        byte[] ret=new byte[4];
        for(int i=0;i<4;i++){
            ret[i]=(byte)(value%10);
            value/=10;
            ret[i]|=(byte)((value%10)<<4);
            value/=10;
        }
        return ret;
    }
Run Code Online (Sandbox Code Playgroud)

这基本上就是它的工作原理.

  • 如果该值小于0或大于99999999,则该值将不适合四个字节.更正式地说,如果该值小于0或者是10 ^(n*2)或更大,其中n是字节数,则该值将不适合n个字节.
  • 对于每个字节:
    • 将该字节设置为除以字节的值除以10的余数.(这会将最后一个数字放在当前字节的低半字节[半字节]中.)
    • 将值除以10.
    • 将值除以10的剩余部分加到该字节的16倍.(这会将现在最后一位数字放在当前字节的高半字节中.)
    • 将值除以10.

(一个优化是预先将每个字节设置为0 - 这是由.NET在分配新数组时隐式完成的 - 并在值达到0时停止迭代.后面的优化不在上面的代码中完成,因为此外,如果可用,一些编译器或汇编器提供了一个除法/余数例程,允许在一个除法步骤中检索商和余数,这是一种通常不需要的优化.)