将 byte[] 数组转换为长度减半的 short[] 数组

Posted

技术标签:

【中文标题】将 byte[] 数组转换为长度减半的 short[] 数组【英文标题】:Convert byte[] array to a short[] array with half the length 【发布时间】:2014-11-20 15:56:54 【问题描述】:

我有一个从文件中读取的byte[200],以小端格式表示short[100]。我是这样读的:

using (FileStream fs = new FileStream(_path, FileMode.Open, FileAccess.Read))

    //fs.Seek(...)
    byte[] record = new byte[200];
    fs.Read(record, 0, record.Length);

    short[] target = new short[100];
    // magic operation that fills target array

我不知道在“魔术操作”中添加什么。我读过BitConverter,但它似乎没有BitConverter.ToShort 操作。无论如何,BitConverter 似乎在循环中进行转换,而如果可能的话,我会很感激以某种方式一次“阻止复制”整个数组。

【问题讨论】:

【参考方案1】:

认为你正在寻找Buffer.BlockCopy

Buffer.BlockCopy(record, 0, target, 0, record.Length);

相信这将保留您所在架构的字节序 - 因此在某些环境中可能不合适。您可能希望将其抽象为一个方法调用,该方法调用可以检查(一次)它是否执行您想要的操作(例如,通过转换 0, 1 并查看结果是 1 还是 256)然后要么使用Buffer.BlockCopy 或在必要时在循环中“手动”执行。

【讨论】:

@ScottChamberlain:如果什么是小端序?处理器架构?如果是这样,我同意。已编辑。 感谢您的回答。文件中的字节必须是 little-endian 格式。而且我想相信每台普通的 PC 也是 little-endian 的。现在就来测试一下。 Buffer.BlockCopy 只是复制不检查/更改字节序。就像memcpy 我糊涂了吗?源的字节序将与目标相同。不是字节序的问题吗?我认为这行得通。 @Jodrell:这是原始数据的字节序与代码运行机器的字节序的问题。 OP 知道数据实际上是 little-endian ... 如果在 big-endian 的机器上使用该数据,他最终会得到错误的结果。你说“这不是字节顺序的问题”,好像这与字节序不同......

以上是关于将 byte[] 数组转换为长度减半的 short[] 数组的主要内容,如果未能解决你的问题,请参考以下文章

将二进制字符串转换为字节数组

java short 数组转换 byte

java short 数组转换 byte数组

在 C++ 中将 unsigned char (byte) 数组转换为 unsigned short

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

byte数组与int,long,short,byte转换 (转载)