Dire que j'ai une collection d'octetsComment prendre une collection d'octets et en extraire des valeurs typées?
var bytes = new byte[] {0, 1, 2, 3, 4, 5, 6, 7};
et je veux tirer une valeur définie des octets comme un type géré, par exemple un ushort
. Quel est un moyen simple de définir quels types résident à quel endroit de la collection et de retirer ces valeurs?
Une façon (laid) est d'utiliser System.BitConverter
et un Queue
ou byte[]
avec un index et simplement itérer, par exemple:
int index = 0;
ushort first = System.BitConverter.ToUint16(bytes, index);
index += 2; // size of a ushort
int second = System.BitConverter.ToInt32(bytes, index);
index += 4;
...
Cette méthode est très, très fastidieux lorsque vous traitez avec beaucoup de ces structures!
Je sais qu'il y a le System.Runtime.InteropServices.StructLayoutAttribute
qui me permet de définir les emplacements des types à l'intérieur d'une structure ou d'une classe, mais il ne semble pas y avoir moyen d'importer la collection d'octets dans cette structure. Si je pouvais en quelque sorte superposer la structure sur la collection d'octets et extraire les valeurs, ce serait idéal. Par exemple.
Foo foo = (Foo)bytes; // doesn't work because I'd need to implement the implicit operator
ushort first = foo.first;
int second = foo.second;
...
[StructLayout(LayoutKind.Explicit, Size=FOO_SIZE)]
public struct Foo {
[FieldOffset(0)] public ushort first;
[FieldOffset(2)] public int second;
}
Des idées sur la façon d'y parvenir?
[EDIT: Voir aussi mon question on how to deal with the bytes when they are big endian.]
Est-ce que tous les types qui vous intéressent sont des ensembles intégrales (ou "fixes" d'intégrales)? – gooch
@gooch: Non, mais nous pourrions nous contenter de cela et écrire des méthodes d'aide pour quand nous avons des chaînes. – Pat
Ok, cela fonctionne très bien pour les types intégraux. C'est un peu encombrant pour les tableaux de ces types, car ils doivent être désignés "fixes" (ce qui signifie essentiellement qu'il s'agit d'un pointeur vers le début de la mémoire). Nous n'avons pas été en mesure d'atteindre d'autres types, mais il existe un moyen de spécifier la taille de chaque champ, cela devient rapidement poilu. – gooch