Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将字节数组转换为UInt32数组? 让我们在C++中得到这样的代码…< /P> void * target uint32 * decPacket = (uint32 *)target;_C#_Arrays_Bytearray_Uint32 - Fatal编程技术网

C# 如何将字节数组转换为UInt32数组? 让我们在C++中得到这样的代码…< /P> void * target uint32 * decPacket = (uint32 *)target;

C# 如何将字节数组转换为UInt32数组? 让我们在C++中得到这样的代码…< /P> void * target uint32 * decPacket = (uint32 *)target;,c#,arrays,bytearray,uint32,C#,Arrays,Bytearray,Uint32,所以在C#中会像 byte[] target; UInt32[] decPacket = (UInt32[])target; 无法将类型byte[]转换为uint[] 我如何将这个内存对齐的东西C++转换成数组C to?< /p> < p>嗯,有些东西是要用的: 请注意,BlockCopy的最后一个参数始终是要复制的字节数,而不管复制的类型如何 你不能仅仅把字节数组当作C#中的uint数组(至少不是在安全代码中;我不知道在不安全代码中是什么)-而是缓冲区。BlockCopy会将字节数组的内容显

所以在C#中会像

byte[] target;
UInt32[] decPacket = (UInt32[])target;
无法将类型byte[]转换为uint[]


<>我如何将这个内存对齐的东西C++转换成数组C to?< /p> < p>嗯,有些东西是要用的:

请注意,
BlockCopy
的最后一个参数始终是要复制的字节数,而不管复制的类型如何

你不能仅仅把
字节
数组当作C#中的
uint
数组(至少不是在安全代码中;我不知道在不安全代码中是什么)-而是
缓冲区。BlockCopy
会将
字节
数组的内容显示到
uint
数组中。。。根据系统的持久性确定结果。就我个人而言,我不喜欢这种方法——当您移动到具有不同内存布局的系统时,它会使代码非常容易出错。我更喜欢在我的协议中明确。希望它能在这种情况下对您有所帮助。

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

像这样:

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]);
 }
Uint32[]res=新的Uint32[target.Length];
对于(int i=0;i,Buffer.BlockCopy可以很好地复制此文件

但是,如果这是一个互操作场景,并且你想直接访问字节数组,如<代码> uTeN[]/code >,那么你最接近的是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++
}

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

如果你愿意走向黑暗面,你可以吃蛋糕(避免分配),也可以吃蛋糕(避免迭代)


查看我对一个相关问题的回答,其中我演示了如何将float[]转换为byte[],反之亦然:

我使用了BitConverter.ToUInt32()


这对我来说似乎很管用。

我要补充一点,有一个肮脏的把戏:有一个更好(更肮脏)的把戏在我的例子中,我的答案是YUP。在C++中,它似乎从来没有复制任何东西。它只是重新从字节扫描到两个字节。至少这个解决方案避免了我使用循环来完成这个过程。在不安全的代码中,你可以排序它。你可以修复数组并使用指针数学来迭代BYT。数组直接作为uint指针。它工作得很好,但它基本上恢复到了C/C++/本机方法…这会起作用吗?它将创建尽可能多的
UInt32
,如果有字节的话。我必须将2个字节转换成1
uint
。我认为
新的UInt32[target.length]
必须是
新的UInt32[target.length/sizeof(第32段)]
如果你想循环,这需要使用位转换器。这将为你提供一个带有单个字节值的单位-这是非常不同的…如果你确信这是正确的,请随意编辑@SSpoke。我随时欢迎愿意修复我错误的人。哇,太棒了!我必须尝试一下!什么是?
CallInteropMethod @ S辐:C,在不安全的上下文中,可以像C++一样运行,并获得所有指针的优缺点。)< CallInteropMethod > <代码>只是在说“这是填充字节[]的东西”。-通常,这将不会用于纯托管代码……我想了一下……我对C++感到厌倦了。这就是为什么我把这个移植到.NET上……所以我将严格地保持C……没有任何不安全的代码。(老实说,我很困惑:我必须把我所有的逻辑都用括号括起来?然后我还有一个encPacket,也是bytes->uint32太复杂了hehe@SSpoke:良好呼叫(除非这是性能关键代码)-我通常在所有情况下都会避免这种情况,除了那些我已经分析并发现如果没有重大影响,很难处理的情况。我很确定如果你这样做,你会得到一个例外。“偏移量和长度超出了数组的界限或计数大于从索引到源集合结尾的元素数”为什么?BlockCopy的参数长度以字节为单位指定。
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++
}
byte[] source = new byte[n];
UInt32 destination;

destination = BitConverter.ToUInt32(source, 0);