将字节数组转换为 int

Posted

技术标签:

【中文标题】将字节数组转换为 int【英文标题】:Convert byte array to int 【发布时间】:2011-09-04 03:26:20 【问题描述】:

我正在尝试在 C# 中进行一些转换,但我不知道该怎么做:

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

谁能给我一些想法?

【问题讨论】:

如果你喜欢边缘生活,你可以使用演员表。 【参考方案1】:

BitConverter 是正确的方法。

您的问题是因为您在承诺 32 时只提供了 8 位。请尝试在数组中使用有效的 32 位数字,例如 new byte[] 0x32, 0, 0, 0

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

ulong ConvertLittleEndian(byte[] array)

    int pos = 0;
    ulong result = 0;
    foreach (byte by in array) 
        result |= ((ulong)by) << pos;
        pos += 8;
    
    return result;


不清楚你的问题的第二部分(涉及字符串)应该产生什么,但我猜你想要十六进制数字? BitConverter 也可以提供帮助,如 an earlier question 中所述。

【讨论】:

我认为字节列表很好,正如我在上面声明的那样 foreach 在字节转换中看起来真的很疯狂( @Mikant:你能解释一下你认为问题出在哪里吗?它对我有用:ideone.com/ML8Nb 通常我们使用这种类型的转换来获得速度...不用担心我们工作的环境。foreachsugar 可能会使work 减慢数百倍...我只想说 foreach 关键字“必须”的使用是有意识的 @Mikant:我认为您将此与其他情况混淆了。数组上的foreach 非常快。如果这里有一个通用接口,比如IEnumerable&lt;byte&gt;,可能会出现性能问题。但是我展示的代码没有“数百次”开销。您可能可以通过展开再挤出几个百分比,但仅此而已。【参考方案2】:

    这是正确的,但你是 失踪,那个Convert.ToInt32 '想要' 32 位(32/8 = 4 字节) 进行转换的信息, 所以你不能只转换一个字节: `新字节 [] 0x32

    完全一样的麻烦 你有。不要忘记 您使用的编码:从编码到编码,您有“每个符号的不同字节数”

【讨论】:

1 没问题。问题2我不清楚,那么我应该使用哪种编码格式?提前致谢【参考方案3】:

一种快速而简单的方法是使用 Buffer.BlockCopy 将字节复制到整数:

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

这有一个额外的好处,就是能够通过操纵偏移量将大量整数解析成一个数组。

【讨论】:

【参考方案4】:
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);

【讨论】:

以上是关于将字节数组转换为 int的主要内容,如果未能解决你的问题,请参考以下文章

C# 将 int 转换为 2 个字节的数组

使用 ByteBuffer 将 n 字节数组转换为整数

swift 将任意长度的字节数组转换为Swift Int

如何将字节从char数组转换为int

将大端字节数组转换为 int,如 python 中的 struct.unpack

如何将Object转换为字节数组(一个对象为List )