Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将二进制资源强制转换为短数组?_C# - Fatal编程技术网

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

C# 如何将二进制资源强制转换为短数组?,c#,C#,我需要处理一个二进制资源(二进制文件的内容)。该文件包含短片。但是,我不知道如何将访问该资源的结果转换为短数组: short[]indexTable=Properties.Resources.indexTable 不起作用;我只能用 byte[]indexTable=Properties.Resources.indexTable 使用Array.Copy不起作用,因为它会将通过访问资源返回的数组中的每个字节转换为短字节 如何解决此问题(手动转换字节数组除外)?有没有办法告诉C#资源的类型是sho

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

short[]indexTable=Properties.Resources.indexTable

不起作用;我只能用

byte[]indexTable=Properties.Resources.indexTable

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

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

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


使用VS 2010 Express和.NET 4.0。

您应该使用BinaryReader:

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


如果你更喜欢“自己动手”的风格,下面是如何做的(不过,我个人更喜欢@Joel Rondeau的方法)

byte[]bytes=Properties.Resources.IndexTable;
short[]shorts=新的short[bytes.Length/2];
对于(int i=0;i短[i/2]=(短)((字节[i]二进制文件包含字节,而不是短字符。短字符是一种特定于系统的结构,字节可以被解释为,就像字节可以被解释为文本、图片或任何你在计算机上看到的东西一样。为什么不使用字节数组呢?比如@Jimmy Hoffa说文件包含字节。Jimmy,这些文件当然包含字节。我想要它的内容要解释为ushort,这意味着我需要将它放入ushort数组中。可能是+1的重复,我在想BitConverter,不习惯使用BinaryReader,我总是在基流中推送字节。我应该试着记住下次有BinaryReader。我希望我能够绕过必须重新读取的字节d从数组元素的角度来看,这是一种很好的读取数据的方法。我不得不考虑一下你和Joel Rondeau的建议,最后还是选择了你的,因为它是最灵活的,并且很容易从资源中读取任意结构的数据。谢谢。BitConverter将比BinaryReader快得多。Wo在使用BitConverter转换资源之前,我是否还需要阅读资源?这看起来是一种有效的方法来完成我想要的任务。谢谢。实际上,我自己也做过类似的工作,但我真的不喜欢它。
byte[] srcTable = Properties.Resources.IndexTable;
short[] destTable = new short[srcTable.Length / 2];
Buffer.BlockCopy(srcTable, 0, destTable, 0, srcTable.Length);
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] )); 
}