J'ai un peu de difficulté à utiliser correctement FieldOffset avec les tableaux. Le code ci-dessous est un exemple où il ne fonctionne pas correctement pour moi:C# StructLayout/FieldOffset et l'indexation dans les tableaux
[StructLayout(LayoutKind.Explicit)]
public struct IndexStruct {
[FieldOffset(0)]
public byte[] data;
[FieldOffset(0)]
public short[] idx16;
[FieldOffset(0)]
public int[] idx32;
}
Si je par exemple définit le tableau nommé « données » à un tableau d'octets sérialisés et puis essayer de récupérer des données sous forme de courts métrages à l'aide de la " champ idx16 "l'indexation est toujours alignée comme un octet []. Ce qui signifie que idx16 1 récupère le deuxième octet dans les données, pas le second mot de 16 bits (octets 2 et 3). Si je fais l'inverse, j'indexe les shorts au lieu des octets, ce qui signifie que l'alignement du décalage est hérité des données sources. Ma question, y a-t-il un moyen de contourner cela? Je sais que je peux compenser la valeur de l'indice en multipliant par la taille de l'élément, mais y a-t-il un autre moyen?
Here est une réponse que j'ai trouvé ici sur StackOverflow, mais en essayant ce code, il s'est avéré que cela ne fonctionnait pas correctement. Essayé à l'aide d'un test unitaire dans 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 à l'avance!
Re votre commentaire; bien sûr, diviser l'index par la taille peut être préférable à un code dangereux ;-p –