C# StructLayout/FieldOffset et l'indexation dans les tableaux

Je vais avoir un peu d'un problème à l'aide de FieldOffset correctement avec les tableaux. Le code ci-dessous est un exemple de situation où il ne fonctionne pas correctement pour moi:

[StructLayout(LayoutKind.Explicit)]
public struct IndexStruct {
    [FieldOffset(0)]
    public byte[] data;

    [FieldOffset(0)]
    public short[] idx16;

    [FieldOffset(0)]
    public int[] idx32;
}

Si j'ai par exemple définit le tableau nommé "data" pour un sérialisé tableau d'octets, puis essayez de récupérer des données comme des shorts à l'aide de la "idx16" champ de l'indexation est toujours aligné comme un byte[]. Ce qui signifie que idx16Un récupère le deuxième octet de données, pas le second 16bit mot (octets 2 et 3). Si je fais l'inverse je l'indice short au lieu d'octets, ce qui signifie que le décalage de l'alignement est héritée de la source de données. Ma question, est-il un moyen de contourner cela? Je sais que je peux compenser la valeur de l'indice en multipliant la taille de l'élément, mais est-il une autre voie?

Ici est une réponse que j'ai trouvé ici sur StackOverflow, mais lorsque j'essaie ce code, il s'est avéré qu'il ne fonctionnait pas correctement. Il a essayé à l'aide d'une Unité de test de VS avec le code suivant, sans succès:

[TestMethod()]
public void SumTest() {
    float[] fArr = {2.0f, 0.5f, 0.0f, 1.0f};
    MemoryStream ms = new MemoryStream();
    for (int i = 0; i < fArr.Length; i++) {
        ms.Write(BitConverter.GetBytes(fArr[i]), 0, sizeof(float));
    }
    byte[] buff = ms.ToArray();
    double expected = 3.5f;
    double actual = Sum(buff);
    Assert.AreEqual(expected, actual);
}

Merci beaucoup d'avance!

Re votre commentaire; bien sûr, en divisant l'indice en fonction de la taille peut être préférable de code non sécurisé ;-p

OriginalL'auteur Burre | 2009-05-08