Lire une structure de données C/C en C

Quel serait le meilleur moyen de remplir un C

请先 登录 后评论

3 réponses

Mufaka

Si vous avez un byte[], vous devriez pouvoir utiliser la classe BinaryReader et définir des valeurs sur NewStuff à l'aide des méthodes ReadX disponibles.

请先 登录 后评论
Coincoin

D'après ce que je peux voir dans ce contexte, vous n'avez pas besoin de copier SomeByteArray dans un tampon. Vous devez simplement obtenir le handle de SomeByteArray, l'épingler, copier les données IntPtr en utilisant PtrToStructure puis relâcher. Pas besoin de copie.

Ce serait :

NewStuff ByteArrayToNewStuff(byte[] bytes)
{
    GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
    try
    {
        NewStuff stuff = (NewStuff)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(NewStuff));
    }
    finally
    {
        handle.Free();
    }
    return stuff;
}

Version générique :

T ByteArrayToStructure<T>(byte[] bytes) where T: struct 
{
    T stuff;
    GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
    try
    {
        stuff = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T));
    }
    finally
    {
        handle.Free();
    }
    return stuff;
}

Version simplifiée (nécessite le commutateur unsafe) :

unsafe T ByteArrayToStructure<T>(byte[] bytes) where T : struct
{
    fixed (byte* ptr = &bytes[0])
    {
        return (T)Marshal.PtrToStructure((IntPtr)ptr, typeof(T));
    }
}
请先 登录 后评论
Tim Ring

Attention aux problèmes d'emballage. Dans l'exemple que vous avez donné, tous les champs sont aux décalages évidents car tout est sur des limites de 4 octets, mais ce ne sera pas toujours le cas. Packs Visual C sur des limites de 8 octets par défaut.

请先 登录 后评论
  • 21 abonnés
  • 0 favoris,363 Feuilleter
  • Chris Miller posée à 2023-03-05 01:28