2010-08-27 8 views
3

J'ai besoin de traiter une ressource binaire (contenu d'un fichier binaire). Le fichier contient des shorts. Je ne peux pas comprendre comment lancer le résultat d'accéder à cette ressource à un tableau si court:Comment convertir une ressource binaire en un tableau court?

short[] indexTable = Properties.Resources.IndexTable;

ne fonctionne pas; Je ne peux pas utiliser

byte[] indexTable = Properties.Resources.IndexTable;

L'utilisation Array.Copy ne fonctionnerait pas car il convertirait chaque octet du tableau retourné en accédant à la ressource à un court.

Comment résoudre ce problème s'il vous plaît (autre que la conversion manuelle du tableau d'octets)? Est-il possible de dire à C# que la ressource est de type short[] plutôt que byte[]?

J'avais même essayé de modifier le fichier resx du projet et de changer les types de données des ressources en System.UInt16, mais j'ai ensuite reçu le message d'erreur que le constructeur pouvait maintenant trouver pour eux. Utilisation de VS 2010 Express et .NET 4.0.

+1

Les fichiers binaires contiennent des octets et non des courts-circuits. Un court-circuit est une structure spécifique au système dont les octets peuvent être interprétés comme étant les mêmes que les octets peuvent être interprétés comme du texte, des images ou tout ce que vous voyez sur un ordinateur. –

+0

Pourquoi ne pas simplement utiliser un tableau d'octets ?? Comme @Jimmy Hoffa a déclaré que les fichiers contiennent des octets. – Gage

+0

Jimmy, bien sûr, ces fichiers contiennent des octets. Je veux que son contenu soit interprété comme ushort bien, et cela signifie que je dois d'une manière ou d'une autre le mettre dans un tableau d'ushort. – karx11erx

Répondre

4

Vous devez utiliser BinaryReader:

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

+1, je pensais BitConverter, pas l'habitude d'utiliser BinaryReader, je pousse toujours juste des octets avec le flux de base. Je devrais essayer de me rappeler qu'il y a un lecteur binaire la prochaine fois .. –

+0

J'avais espéré pouvoir me déplacer en ayant à lire l'élément de tableau sage, mais c'est un bon moyen de lire les données comme je veux. – karx11erx

+0

J'ai dû réfléchir longuement sur les propositions de Joel Rondeau et, à la fin, je suis allé à la vôtre parce que c'est la plus souple et permet facilement de lire des données arbitrairement structurées à partir de ressources. Je vous remercie. – karx11erx

4

Buffer.BlockCopy()

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

Cela ressemble à un moyen efficace de faire ce que je veux. Je vous remercie. – karx11erx

0

Voilà comment si vous préférez un 'Do it yourself' de style (cependant, je préfère la méthode de @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])); 
} 
+0

J'avais en fait construit quelque chose comme ça, mais je ne l'aimais vraiment pas. – karx11erx

Questions connexes