将int []转换为byte:如何查看int [],因为它是byte []?

时间:2012-01-07 20:44:17

标签: c# types int byte

解释:我有一组整数作为输入。我需要将其转换为字节数组,其中1 int = 4 bytes(big endian)。在C ++中,我可以轻松地将其转换为然后访问该字段,就好像它是字节数组一样,无需复制或计算数据 - 只需直接访问即可。这可能在C#中吗?在C#2.0中?

5 个答案:

答案 0 :(得分:5)

是的,使用不安全的代码:

int[] arr =...
fixed(int* ptr = arr) {
    byte* ptr2 = (byte*)ptr;
    // now access ptr2[n]
}

如果编译器抱怨,请添加(void*)

    byte* ptr2 = (byte*)(void*)ptr;

答案 1 :(得分:4)

你可以创建一个byte [] 4倍于int [] lenght的大小。 然后,你通过你的整数数组&从以下字节获取字节数组:

BitConverter.GetBytes(int32);

接下来,使用Buffer.BlockCopy将此函数的4个字节复制到正确的偏移量(i * 4)。

BitConverter Buffer.BlockCopy

答案 2 :(得分:2)

查看BitConverter课程。您可以遍历int数组,并调用BitConverter.GetBytes(Int32)为每个数组获得byte[4]

答案 3 :(得分:1)

如果编写不安全的代码,可以在内存中修复数组,获取指向其开头的指针,并转换该指针。

unsafe
{
  fixed(int* pi=arr)
  {
    byte* pb=(byte*)pi;
    ...
  }
}

.net中的数组以元素数量为前缀,因此您无法在指向相同数据的int[]byte[]之间进行安全转换。你可以在uint[]int[]之间进行投射(至少就.net而言,C#本身对此功能的支持有点不一致)。

还有基于联合的技巧来重新解释演员推荐,但我强烈建议使用它。


以原始字节顺序从字节数组中获取单个整数的常用方法是BitConverter,但它相对较慢。手动代码通常更快。当然它不支持反向转换。

手动转换假设小端的一种方法(在我的2.6GHz i3上每秒管理大约4亿次读取):

byte GetByte(int[] arr, int index)
{
  uint elem=(uint)arr[index>>2];
  return (byte)(elem>>( (index&3)* 8));
}

如果你想使用托管代码,我建议手动编写使用bitshifting访问单个字节的代码,如果你想要最后一点性能,我建议使用指针。

您还需要注意字节序问题。其中一些方法仅支持本机字节序。

答案 4 :(得分:1)

类型安全托管代码中最简单的方法是使用:

byte[] result = new byte[intArray.Length * sizeof(int)];
Buffer.BlockCopy(intArray, 0, result, 0, result.Length);

我认为你的问题并没有那么做,因为在小端架构(比如x86或ARM)上,结果数组最终会变成小端,但我很确定C ++也是如此。同样。

如果您可以使用unsafe{},则还有其他选择:

unsafe{
  fixed(byte* result = (byte*)(void*)intArray){
    // Do stuff with result.
  }
}