配列でFieldOffsetを正しく使用するのに少し問題があります。以下のコードは、私にとって正しく機能しない例です。
[StructLayout(LayoutKind.Explicit)]
public struct IndexStruct {
[FieldOffset(0)]
public byte[] data;
[FieldOffset(0)]
public short[] idx16;
[FieldOffset(0)]
public int[] idx32;
}
たとえば、「data」という名前の配列をシリアル化されたバイト配列に設定し、「idx16」フィールドを使用してデータをshortとして取得しようとすると、インデックスは引き続きbyte[]として整列されます。つまり、idx16 1は、2番目の16ビットワード(バイト2および3)ではなく、データの2番目のバイトをフェッチします。逆の場合、バイトの代わりにショートのインデックスを作成します。これは、オフセットの配置がソースデータから継承されることを意味します。私の質問、これを回避する方法はありますか?要素のサイズを掛けることでインデックス値を補正できることは知っていますが、別の方法はありますか?
これがStackOverflowで見つけた答えですが、そのコードを試してみると、正しく機能していないことがわかりました。VSでユニットテストを使用して、次のコードで試してみましたが、成功しませんでした。
[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);
}
よろしくお願いします!