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

3
我需要处理一个二进制资源(二进制文件的内容),该文件包含shorts。但我无法强制将访问该资源的结果转换为short数组: short[] indexTable = Properties.Resources.IndexTable; 无法使用,只能使用 byte[] indexTable = Properties.Resources.IndexTable; 使用Array.Copy也不行,因为它会将访问资源返回的每个字节转换为short。
请问如何解决这个问题(除了手动转换字节数组)?有没有办法告诉C#资源的类型是short[]而不是byte[]?
我甚至尝试编辑项目的resx文件并将资源的数据类型更改为System.UInt16,但然后我收到错误消息说找不到构造函数。
使用VS 2010 Express和.NET 4.0。

1
二进制文件包含字节,而不是shorts。Short是一个系统特定的结构,它可以将字节解释为与文本、图片或计算机上看到的任何其他东西相同的形式。 - Jimmy Hoffa
为什么不直接使用字节数组呢?就像@Jimmy Hoffa所说,文件包含字节。 - Gage
Jimmy,当然这些文件包含字节。但我希望它的内容被解释为ushort类型,这意味着我需要将其转换为一个ushort数组。 - Razzupaltuff
3个回答

4

您应该使用BinaryReader:

using (var reader = new BinaryReader(new MemoryStream(Properties.Resources.IndexTable)))
{
    var firstValue = reader.ReadInt16();
    ...
}

+1,我一直在想BitConverter,不习惯使用BinaryReader,我总是用基本流推送字节。下次我应该记得有一个二进制读取器。 - Jimmy Hoffa
我本希望能够避免逐个读取数组元素,但这是按照我想要的方式读取数据的好方法。 - Razzupaltuff
我花了一些时间思考你和Joel Rondeau的建议,最终选择了你的,因为它是最灵活的,并且可以轻松地从资源中读取任意结构化数据。谢谢。 - Razzupaltuff
BitConverter比BinaryReader快得多。 - Ben Voigt
在使用 BitConverter 进行转换之前,我难道不仍然需要读取该资源吗? - Razzupaltuff

4

Buffer.BlockCopy()

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

这看起来是我想要的有效方法。谢谢。 - Razzupaltuff

0

如果您喜欢“自己动手”的风格,这里是如何操作的(不过,我个人更喜欢@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] )); 
}

我曾经自己构建了类似的东西作为一个解决方法,但我真的不喜欢它。 - Razzupaltuff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接