【问题标题】:Converting an array of 2 consecutive bytes to integers faster更快地将 2 个连续字节的数组转换为整数
【发布时间】:2013-01-01 21:45:43
【问题描述】:

我有“巨大”的数据量,可能在 50 到 100 兆字节之间变化。 我使用 filestreamer 将这些数据作为字节数组读取。

问题是,我想将所有连续的 2 个字节转换为整数。 我这样做的方法是循环遍历字节数组,步长为 2,然后使用 BitConvert 进行转换:

_data[i] = BitConverter.ToInt16(soundData[i : i + 2], 0) // Convert 2 bytes into an int and store at i

所以每两个字节都会变成一个 Int16。 但问题是这太慢了,对于大约 50 兆字节的文件,这可能需要 20 秒!

是否有一种通用的方法可以立即执行此操作,而不是在我的数据数组的每 2 个字节上调用此函数,这样它就不会那么慢?最好以“安全”的方式,所以没有不安全的代码。

【问题讨论】:

  • “快”? “单核细胞增多症”? mono-project.com/Interop_with_Native_Libraries
  • stream 的全部意义在于在加载数据的同时对其进行处理,而不是先加载数据然后对其进行迭代。转换真的是瓶颈吗?你能在你的问题中加入循环吗?

标签: c# .net mono boo


【解决方案1】:

如果字节数组在正确的字节序中,那么只需分配一个 Int16 数组并使用 Buffer.Block 复制(空中代码):

byte[] b = new byte[]{1, 2, 3, 4};
short[] s = new short[2]; // 4 bytes long
Buffer.BlockCopy(b, 0, s, 0, 4);

【讨论】:

  • 字节序确实是正确的,使用这种方法我的50MB数据可以在1.5s而不是15-20s内转换,这是一个巨大的进步!
【解决方案2】:

如果没有测试,我不确定我的数学和“字节顺序”是否正确,但另一种选择是尝试这样的事情:

// Convert 2 bytes into an int and store at i
_data[j] = (int)soundData[i] + (soundData[i + 1] << 8);

如果这还不够快,那么您可能需要一种不同的方法来解决问题。

可以为这个问题找到一些其他的想法:Convert Byte Array to Integer In VB.Net

【讨论】:

  • 换档前可能需要演员阵容。
  • 已添加,尽管我不确定他要转换为哪种类型的整数。
猜你喜欢
  • 2021-03-14
  • 2013-06-08
  • 1970-01-01
  • 2014-07-26
  • 2021-03-24
  • 2018-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多