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