Ich habe ein kleines Problem mit FieldOffset korrekt mit Arrays. Der folgende Code ist ein Beispiel, wo es nicht richtig für mich funktioniert:C# StructLayout/FieldOffset und Indizierung in Arrays
[StructLayout(LayoutKind.Explicit)]
public struct IndexStruct {
[FieldOffset(0)]
public byte[] data;
[FieldOffset(0)]
public short[] idx16;
[FieldOffset(0)]
public int[] idx32;
}
Wenn ich zum Beispiel das Array „Daten“ auf eine serialisierte Byte-Array namens setzt und dann versuchen, Daten wie Shorts abzurufen unter Verwendung " idx16 "Feld ist die Indizierung immer noch als Byte [] ausgerichtet. Das bedeutet, dass idx16 1 das zweite Byte in Daten holt, nicht das zweite 16-Bit-Wort (Byte 2 und 3). Wenn ich das Inverse mache, indexiere ich Kurzschlüsse anstelle von Bytes, was bedeutet, dass die Versatzausrichtung von den Quelldaten geerbt wird. Meine Frage, gibt es eine Möglichkeit, dies zu umgehen? Ich weiß, dass ich den Indexwert durch Multiplikation mit der Größe des Elements kompensieren kann, aber gibt es einen anderen Weg?
Here ist eine Antwort, die ich hier auf StackOverflow gefunden habe, aber als ich diesen Code ausprobierte, stellte sich heraus, dass er nicht richtig funktionierte. Versuchte es mit einem Unit-Test in VS mit dem folgenden Code ohne Erfolg:
[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);
}
Vielen Dank im Voraus!
Re Ihren Kommentar; Natürlich ist es vielleicht besser, den Index durch die Größe zu teilen, als unsicheren Code ;-p –