关于c#:将字节数组转换为int


Convert byte array to int

我正在尝试在C中进行一些转换,我不确定如何执行此操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private int byteArray2Int(byte[] bytes)
{
    // bytes = new byte[] {0x01, 0x03, 0x04};

    // how to convert this byte array to an int?

    return BitConverter.ToInt32(bytes, 0); // is this correct?
    // because if I have a bytes = new byte [] {0x32} => I got an exception
}

private string byteArray2String(byte[] bytes)
{
   return System.Text.ASCIIEncoding.ASCII.GetString(bytes);

   // but then I got a problem that if a byte is 0x00, it show 0x20
}

有人能给我一些建议吗?


BitConverter是正确的方法。

你的问题是因为你承诺32时只提供了8位。在数组中尝试一个有效的32位数字,如new byte[] { 0x32, 0, 0, 0 }

如果要转换任意长度的数组,可以自己实现:

1
2
3
4
5
6
7
8
9
10
ulong ConvertLittleEndian(byte[] array)
{
    int pos = 0;
    ulong result = 0;
    foreach (byte by in array) {
        result |= ((ulong)by) << pos;
        pos += 8;
    }
    return result;
}

不清楚问题的第二部分(涉及字符串)应该产生什么,但我想你想要十六进制数字?如前一个问题所述,BitConverter也可以帮助解决这个问题。


1
2
3
4
5
6
7
8
9
byte[] bytes = { 0, 0, 0, 25 };

// If the system architecture is little-endian (that is, little end first),
// reverse the byte array.
if (BitConverter.IsLittleEndian)
  Array.Reverse(bytes);

int i = BitConverter.ToInt32(bytes, 0);
Console.WriteLine("int: {0}", i);


  • 这是正确的,但你不见了,那个Convert.ToInt32。"想要"32位(32/8=4字节)转换信息,因此不能只转换一个字节:`新字节[]0x32

  • 完全一样的麻烦你有。别忘了您使用的编码:从编码到编码,您有"每个符号的字节计数不同"


  • 一种快速而简单的方法就是使用buffer.blockcopy将字节复制到整数:

    1
    2
    3
    UInt32[] pos = new UInt32[1];
    byte[] stack = ...
    Buffer.BlockCopy(stack, 0, pos, 0, 4);

    这样做的另一个好处是,只需操作偏移量,就可以将许多整数解析为数组。