2009-07-21 5 views
0

Related QuestionComment marshaler un tableau d'octets à une structure?

Dans la question connexe, j'essayais de trouver le moyen le plus rapide. La méthode que j'ai choisie dans cette question est devenue un goulot d'étranglement pour moi. Je suis en train de lire des données binaires d'un fichier et j'ai besoin de le mettre dans une définition de structure gérée. Il n'y a pas de code non géré, donc je pense qu'il y a une meilleure façon que d'attribuer le GCHandle.

Existe-t-il un moyen de lancer un tableau d'octets vers une structure de même taille?

Répondre

0

J'ai une méthode comme ceci:

static public T ReadStructure<T>(byte[] bytes) 
    where T : struct 
{ 
    int len = Marshal.SizeOf(typeof(T)); 
    IntPtr i = Marshal.AllocHGlobal(len); 

    try 
    { 
     Marshal.Copy(bytes, 0, i, len); 
     return (T)Marshal.PtrToStructure(i, typeof(T)); 
    } 
    finally 
    { 
     Marshal.FreeHGlobal(i); 
    } 
} 

Certes, ce n'est pas très rapide - le besoin, mais il ne semble pas être, dans mon cas. Est-ce votre solution actuelle, et vous trouvez que les frais généraux alloc/copy/release sont trop lents?

+0

Je peux essayer ça. Le problème est que je dois lire 254 octets, vérifier si les 240 premiers contiennent un type, et si oui, passer à autre chose. Avec cette méthode, je lis les données du fichier, copie les 240 premiers octets dans un ptr, le vérifie, puis copie le tout 254 dans un ptr. Beaucoup de copie se passe. – scottm

+0

On dirait qu'il y a quelques pistes d'optimisation. Pourriez-vous poster du code? –

+0

@Ben, la question connexe a un exemple de ce que je fais actuellement. – scottm

0

Vous pouvez consulter ce code:


struct Foo 
{ 
    public int x; 
} 

public unsafe static void Main() 
{ 
    byte[] x = new byte[] { 1, 1, 0, 0 }; 
    Foo f; 

    fixed (byte* xPtr = x) 
    { 
    f = *((Fpp*)xPtr); 
    } 

    Console.WriteLine(f.x); 
} 

Il est certainement très dangereux, annonce que vous pourriez avoir des problèmes si la structure contient des types plus complexes.

+0

Quelles sont les implications de l'utilisation de cette méthode à travers les frontières 32/64bit? Est-il possible de garantir des représentations exactement identiques sur toutes les machines qui pourraient partager des données stockées et lues avec cette méthode? –

+0

Qu'est-ce que Fpp? Lorsque j'essaie une déclaration similaire en utilisant mon type, je reçois "Impossible de prendre l'adresse de, obtenir la taille ou déclarer un pointeur sur un type géré" – scottm

+0

Je pense qu'il voulait écrire Foo, pas Fpp. –

Questions connexes