将 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[] 数组的主要内容,如果未能解决你的问题,请参考以下文章
在 C++ 中将 unsigned char (byte) 数组转换为 unsigned short