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

时间:2010-08-27 17:22:12

标签: c#

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

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。

3 个答案:

答案 0 :(得分:4)

你应该使用BinaryReader:

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

答案 1 :(得分:4)

Buffer.BlockCopy()

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

答案 2 :(得分: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] )); 
}