如何将二进制资源转换为短数组?

Posted

技术标签:

【中文标题】如何将二进制资源转换为短数组?【英文标题】:How to cast binary resource to short array? 【发布时间】:2010-08-27 17:22:12 【问题描述】:

我需要处理一个二进制资源(二进制文件的内容)。该文件包含短裤。我不知道如何将访问该资源的结果转换为一个短数组:

short[] indexTable = Properties.Resources.IndexTable;

不起作用;我只能用

byte[] indexTable = Properties.Resources.IndexTable;

使用Array.Copy 不起作用,因为它会将访问资源返回的数组中的每个字节转换为短字节。

请问我该如何解决这个问题(除了手动转换字节数组)?有没有办法告诉 C# 资源的类型是 short[] 而不是 byte[]

我什至尝试编辑项目的 resx 文件并将资源的数据类型更改为 System.UInt16,但随后我收到错误消息,现在可以为它们找到构造函数。

使用 VS 2010 Express 和 .NET 4.0。

【问题讨论】:

二进制文件包含字节,而不是短裤。 short 是一种系统特定的结构,可以将字节解释为,就像字节可以解释为文本、图片或您在计算机上看到的任何其他内容一样。 为什么不直接使用字节数组??就像@Jimmy Hoffa 所说的文件包含字节。 吉米,这些文件当然包含字节。我希望它的内容被解释为 ushort,这意味着我需要以某种方式将它放入一个 ushort 数组中。 Directly reading large binary file in C# w/out copying 的可能重复项 【参考方案1】:

你应该使用 BinaryReader:

using (var reader = new BinaryReader(new MemoryStream(Properties.Resources.IndexTable)))

    var firstValue = reader.ReadInt16();
    ...

【讨论】:

+1,我在想 BitConverter,不习惯使用 BinaryReader,我总是只用基本流推送字节。下次我应该尽量记住有一个二进制阅读器.. 我曾希望我能够避免必须明智地读取数组元素,但这是以我想要的方式读取数据的好方法。 我不得不考虑你和 Joel Rondeau 的提议,最终选择了你的提议,因为它是最灵活的,并且可以轻松地从资源中读取任意结构化的数据。谢谢。 BitConverter 会比 BinaryReader 快得多。 在使用 BitConverter 转换资源之前,我是否还需要阅读资源?【参考方案2】:

Buffer.BlockCopy()

byte[] srcTable = Properties.Resources.IndexTable;
short[] destTable = new short[srcTable.Length / 2];
Buffer.BlockCopy(srcTable, 0, destTable, 0, srcTable.Length);

【讨论】:

这看起来是一种有效的方式来做我想做的事。谢谢。【参考方案3】:

如果您更喜欢“自己动手”的风格,请按照以下方式(不过,我个人更喜欢 @Joel Rondeau 的方法)

byte[] bytes = Properties.Resources.IndexTable;
short[] shorts = new short[bytes.Length/2];

for( int i = 0; i < bytes.Length; i += 2 )

    // the order of these depends on your endianess
    // big
    shorts[i/2] = (short)(( bytes[i] << 8 ) | (bytes[i+1] )); 
    // little
    // shorts[i/2] = (short)(( bytes[i+1] << 8 ) | (bytes[i] )); 

【讨论】:

我自己实际上已经构建了类似的东西作为解决方法,但我真的不喜欢它。

以上是关于如何将二进制资源转换为短数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何将字符串(字节数组作为字符串)转换为短字符串

将位数组转换为短数组

如何将整数转换为存储在数组中的二进制

如何将二进制类列转换为 numpy 数组

如何将16进制 转换byte数组

如何将Mac地址转换为十六进制并将其传递给java中的字节数组