如何将字节数组转换为UInt32数组?

让我们说在C ++中我得到了这样的代码..

void * target uint32 * decPacket = (uint32 *)target; 

所以在C#中就像…

 byte[] target; UInt32[] decPacket = (UInt32[])target; 

无法将byte []转换为uint []

我如何将C ++对数组的内存对齐转换为C#?

好吧,接近的是使用Buffer.BlockCopy

 uint[] decoded = new uint[target.Length / 4]; Buffer.BlockCopy(target, 0, decoded, 0, target.Length); 

请注意,无论您要复制的类型如何, BlockCopy的最后一个参数始终是要复制的字节数。

您不能仅仅将byte数组视为C#中的uint数组(至少不是安全代码;我不知道在不安全的代码中) – 但Buffer.BlockCopy会将byte数组的内容展开到uint数组中…根据系统的字节顺序确定结果。 就个人而言,我不是这种方法的粉丝 – 当你转移到具有不同内存布局的系统时,它会使代码容易出错。 我更愿意明确我的协议。 希望它能在这种情况下帮助你。

如果你愿意转向黑暗的一面,你可以吃蛋糕(避免分配)并吃它(避免迭代)。

查看我对相关问题的回答,其中我演示了如何将float []转换为byte [],反之亦然:将float []转换为byte [] 的最快方法是什么?

正如Jon所说 ,Buffer.BlockCopy可以很好地复制它。

但是,如果这是一个互操作方案,并且您希望直接以uint[]访问字节数组,那么最接近C ++的方法就是使用不安全的代码:

 byte[] target; CallInteropMethod(ref target); fixed(byte* t = target) { uint* decPacket = (uint*)t; // You can use decPacket here the same way you do in C++ } 

我个人更喜欢制作副本,但如果你需要避免实际复制数据,这确实可以让你工作(在不安全的环境中)。

您可以使用Buffer.BlockCopyArray.Copy不是Array.CopyBlockCopy执行字节级复制,而不检查数组类型是否完全兼容。

像这样:

 uint[] array = new uint[bytes.Length/4]; Buffer.BlockCopy(bytes, 0, array, 0, bytes.Length); 

遍历所有数组项并在每个数组上调用Convert.ToUint32()。这里:

  Uint32[] res = new Uint32[target.Length]; for(int i = 0;i <= target.Length;i++) { res[i] = Convert.ToUint32(target[i]); } 

这是MSDN的官方链接。 http://msdn.microsoft.com/en-us/library/469cwstk.aspx