在 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 个字节? 它只是复制内存。它不知道intbyteresult 的内存表示将与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数组转string

无法在 C# 中将类型 'byte[]' 隐式转换为 'byte?[]'

如何在 C# 中将 Byte* 从 C++ 转换为 Byte[]

如何在 Go 编程中将 []byte 转换为 int

如何在 C# 中将 List<byte> 转换为 byte[]?

c# vs2003 我有个byte[]数组,如何存入文件?