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

时间:2011-09-02 20:28:16

标签: c# arrays bytearray uint32

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

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

所以在C#中它就像......

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

无法将字节[]转换为uint []

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

6 个答案:

答案 0 :(得分:12)

嗯,接近的是使用Buffer.BlockCopy

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

请注意,BlockCopy的最后一个参数总是要复制的字节数,无论您要复制的是哪种类型。

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

答案 1 :(得分:2)

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

查看我对相关问题的回答,其中我演示了如何将float []转换为byte [],反之亦然:What is the fastest way to convert a float[] to a byte[]?

答案 2 :(得分:1)

As Jon mentioned,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++
}

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

答案 3 :(得分:0)

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

像这样:

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

答案 4 :(得分:0)

我使用了BitConverter.ToUInt32()-https://docs.microsoft.com/en-us/dotnet/api/system.bitconverter.touint32?view=netcore-3.1

byte[] source = new byte[n];
UInt32 destination;

destination = BitConverter.ToUInt32(source, 0);

对我来说似乎很好。

答案 5 :(得分:-1)

遍历所有数组项并在每个数组上调用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