如何将二进制资源转换为短数组?
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] ));
【讨论】:
我自己实际上已经构建了类似的东西作为解决方法,但我真的不喜欢它。以上是关于如何将二进制资源转换为短数组?的主要内容,如果未能解决你的问题,请参考以下文章