C# 就地将 `int[]` 数组转换为 `byte[]` 数组

Posted

技术标签:

【中文标题】C# 就地将 `int[]` 数组转换为 `byte[]` 数组【英文标题】:C# in-place cast `int[]` array to `byte[]` array 【发布时间】:2022-01-11 02:04:27 【问题描述】:

我有一个某种类型的数组(short[]int[] 或类似的基本类型)。我想通过流发送它,所以我需要它是byte[]。标准解决方案似乎是创建一个新的byte[] 数组,并使用BitConverter。这种方法的问题在于性能和内存使用 - 它需要分配所有新内存,复制到新内存中,然后将 byte[] 写入流。

我非常想将int[] 数组的原始后备内存用作byte[] 数组,以便我可以就地发送它。为了这个非常明显和非常显着的性能差异,我愿意强制要求发送和接收系统必须是相同的字节序。

有没有办法将int[] 或类似的数组作为byte[] 就地处理?

【问题讨论】:

***.com/a/66983061 如果Span<T> 不可用,请记住,如果您正在写入流,则不必一次转换整个数组,您可以逐块进行。它不会为您节省处理周期,但不会花费您太多的内存 【参考方案1】:

如果可以使用Span<T>(.net core 3+):

void Send(int[] data)

    ReadOnlySpan<byte> byteRef = MemoryMarshal.AsBytes(data.AsSpan());
    _stream.Write(byteRef);

【讨论】:

这是个好消息,感谢您的回复!我现在正在阅读Span&lt;T&gt;,我需要弄清楚如何在接收端从byte[] 转换回int[]。如果您碰巧在我找到它之前发布它,将不胜感激。 在接收端,只需创建另一个int[],并从中创建一个Span&lt;byte&gt;,并将_stream.Read() 放入span。十分简单。 :-D

以上是关于C# 就地将 `int[]` 数组转换为 `byte[]` 数组的主要内容,如果未能解决你的问题,请参考以下文章

c# 中如何把 string 类型如何转换为uint类型啊?

c# - 最快的方法从部分位获取整数

将char数组转换为int数组c#

C# 将 ReadOnlyCollection<int> 转换为 byte[] 数组

C# 将 int 转换为 2 个字节的数组

是否可以将 MVC C# List<int> 转换为 javascript 数组?