J'essaie de lire des données binaires en utilisant C#. J'ai toutes les informations sur la disposition des données dans les fichiers que je veux lire. Je suis capable de lire les données "morceau par morceau", c'est-à-dire de récupérer les 40 premiers octets de données en les convertissant en une chaîne de caractères, puis de récupérer les 40 octets suivants.
Comme il existe au moins trois versions légèrement différentes des données, j'aimerais lire les données directement dans un struct. Cela me semble tellement plus juste que de les lire "ligne par ligne".
J'ai essayé l'approche suivante, mais sans succès :
StructType aStruct;
int count = Marshal.SizeOf(typeof(StructType));
byte[] readBuffer = new byte[count];
BinaryReader reader = new BinaryReader(stream);
readBuffer = reader.ReadBytes(count);
GCHandle handle = GCHandle.Alloc(readBuffer, GCHandleType.Pinned);
aStruct = (StructType) Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(StructType));
handle.Free();
Le flux est un FileStream ouvert à partir duquel j'ai commencé à lire. J'obtiens un AccessViolationExceptio
n lors de l'utilisation de Marshal.PtrToStructure
.
Le flux contient plus d'informations que ce que j'essaie de lire puisque je ne suis pas intéressé par les données à la fin du fichier.
La structure est définie comme suit :
[StructLayout(LayoutKind.Explicit)]
struct StructType
{
[FieldOffset(0)]
public string FileDate;
[FieldOffset(8)]
public string FileTime;
[FieldOffset(16)]
public int Id1;
[FieldOffset(20)]
public string Id2;
}
Le code des exemples a été modifié par rapport à l'original pour rendre cette question plus courte.
Comment lire les données binaires d'un fichier dans une structure ?