在 C# 中将 int[] 转换为 byte[]
Posted
技术标签:
【中文标题】在 C# 中将 int[] 转换为 byte[]【英文标题】:Converting an int[] to byte[] in C# 【发布时间】:2011-08-19 07:04:36 【问题描述】:我知道如何做到这一点:通过创建一个必要大小的字节数组并使用 for 循环从 int 数组中转换每个元素。
我想知道是否有更快的方法,因为如果int
大于sbyte
,上述方法似乎会中断。
【问题讨论】:
byte array
和“大于short
”不匹配。
我的意思是 int 在大小上不是一对一的字节。
而short/ushort与字节不是一一对应的。
@scandos: 你想将 4 个字节转换为 1 个 int,... 等等。请注意问题下方的 Edit 链接。
@henk:抱歉。我没有考虑,但假设我可以只加载 4 个字节,然后将它们作为 int 读取。似乎它需要更多的“格式化”,因为并非每 4 个字节可能意味着一个 int(较小的数字需要较少的空间,如上所述,直接转换会导致数据丢失)。
【参考方案1】:
除了公认的答案(我现在正在使用)之外,Linq 爱好者的另一种选择是:
byte[] bytes = ints.SelectMany(BitConverter.GetBytes).ToArray();
不过,我想它会更慢......
【讨论】:
是的,但它可以用于快速的短单元测试。建议进行编辑,因为您不需要v=>
... yptes(v)
【参考方案2】:
如果您想要按位复制,即从一个 int 中获取 4 个字节,请使用 Buffer.BlockCopy
:
byte[] result = new byte[intArray.Length * sizeof(int)];
Buffer.BlockCopy(intArray, 0, result, 0, result.Length);
不要使用Array.Copy
,因为它会尝试转换而不仅仅是复制。有关详细信息,请参阅 MSDN 页面上的备注。
【讨论】:
它如何知道每个 int 获得 4 个字节? 它只是复制内存。它不知道int
或byte
。 result
的内存表示将与intArray
完全相同。
@Moop int[] result = new int[byteArray.Length / sizeof(int)]; Buffer.BlockCopy(byteArray, 0, result, 0, result.Length);
如果不知道值类型数组编译时的元素类型,也可以使用如下:byte[] result = new byte[Buffer.ByteLength((Array)valueTypeArray)];
只是对丹尼尔提供的逆解决方案的更正(从 byte[] 到 int[])它应该是: Buffer.BlockCopy(byteArray, 0, result, 0, byteArray.Length); => 基本上最后一个参数不应该是 result.Length 而是 byteArray,Length以上是关于在 C# 中将 int[] 转换为 byte[]的主要内容,如果未能解决你的问题,请参考以下文章
无法在 C# 中将类型 'byte[]' 隐式转换为 'byte?[]'
如何在 C# 中将 Byte* 从 C++ 转换为 Byte[]