短字节转换

本文关键字:转换 字节 | 更新日期: 2023-09-27 17:58:11

我正在尝试将一个短类型转换为2字节类型,以存储在字节数组中,这是"到目前为止"运行良好的片段。

if (type == "short")
{
   size = data.size;
   databuffer[index+1] = (byte)(data.numeric_data >> 8);
   databuffer[index] = (byte)(data.numeric_data & 255);
   return size;
}

Numeric_data是int类型。在我处理数值284(十进制)之前,一切都很顺利。结果表明,284>>8是1而不是4。

主要目标是拥有:

byte[0] = 28
byte[1] = 4

短字节转换

这就是您想要的:

    static void Main(string[] args)
    {
        short data=284;
        byte[] bytes=BitConverter.GetBytes(data);
        // bytes[0] = 28
        // bytes[1] = 1
    }

只是为了好玩:

public static byte[] ToByteArray(short s)
{
    //return, if `short` can be cast to `byte` without overflow
    if (s <= byte.MaxValue) 
        return new byte[] { (byte)s };
    List<byte> bytes = new List<byte>();
    byte b = 0;
    //determine delta through the number of digits
    short delta = (short)Math.Pow(10, s.ToString().Length - 3);
    //as soon as byte can be not more than 3 digits length
    for (int i = 0; i < 3; i++) 
    {
        //take first 3 (or 2, or 1) digits from the high-order digit
        short temp = (short)(s / delta);
        if (temp > byte.MaxValue) //if it's still too big
            delta *= 10;
        else //the byte is found, break the loop
        {
            b = (byte)temp;
            break;
        }
    }
    //add the found byte
    bytes.Add(b);
    //recursively search in the rest of the number
    bytes.AddRange(ToByteArray((short)(s % delta))); 
    return bytes.ToArray();
}

这种递归方法用至少任何正的CCD_ 1值来完成OP所需要的。

为什么284 >> 8会是4

为什么284会被拆分为等于284的两个字节?

284的二进制表示是0000 0001 0001 1100。如您所见,共有两个字节(八位),分别是0000 0001(十进制为short0)和0001 1100(十进制为28)。

284 >> 810000 0001)并且是正确的。

CCD_ 16应该被分割成等于CCD_ 17和CCD_ 18的两个字节。

您的转换是正确的

如果你坚持:

short val = 284;
byte a = (byte)(val / 10);
byte b = (byte)(val % 10);

免责声明:

这没有多大意义,但这正是你想要的。我想您需要0到99之间的值。合乎逻辑的做法是使用100作为分母,而不是10。但话说回来,我不知道你想做什么。

放弃您正在使用的无意义转换,转而使用System.BitConverter.ToInt16

  //to bytes
  var buffer = System.BitConverter.GetBytes(284); //your short value
  //from bytes
  var value = System.BitConverter.ToInt16(buffer, 0);