6

可以说在 C++ 中我得到了这样的代码..

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

所以在 C# 中它会像..

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

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

如何将 C++ 所做的内存对齐操作转换为数组到 C#?

4

6 回答 6

12

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

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

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

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

于 2011-09-02T20:31:49.123 回答
2

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

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

于 2012-03-12T11:37:57.610 回答
1

正如 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++
}

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

于 2011-09-02T20:39:09.800 回答
0

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

像这样:

uint[] array = new uint[bytes.Length/4];
Buffer.BlockCopy(bytes, 0, array, 0, bytes.Length);
于 2011-09-02T20:32:04.223 回答
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);

这对我来说似乎工作得很好。

于 2020-10-23T08:30:39.227 回答
-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

于 2011-09-02T20:36:23.790 回答