【问题标题】:Converting an int[] to byte[] in C#在 C# 中将 int[] 转换为 byte[]
【发布时间】: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(较小的数字需要较少的空间,如上所述,直接转换会导致数据丢失)。

标签: c# arrays type-conversion


【解决方案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
猜你喜欢
  • 2020-02-03
  • 1970-01-01
  • 2012-08-01
  • 2011-06-24
  • 1970-01-01
  • 2012-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多