配列でFieldOffsetを正しく使用すると少し問題があります。私は、例えば、シリアル化されたバイト配列に「データ」という名前の配列を設定した場合配列内のC#StructLayout/FieldOffsetとインデックス付け
[StructLayout(LayoutKind.Explicit)]
public struct IndexStruct {
[FieldOffset(0)]
public byte[] data;
[FieldOffset(0)]
public short[] idx16;
[FieldOffset(0)]
public int[] idx32;
}
、その後は、「使用してショートパンツなどのデータを取得しよう:以下のコードは、それが私のために正常に動作しない例です。 idx16 "フィールドでは、インデックスはまだバイト[]として整列されています。 idx16 1が、2番目の16ビットワード(バイト2と3)ではなく、データの2番目のバイトをフェッチすることを意味します。バイトの代わりに逆Iインデックスの短絡を行うと、オフセットの配置がソースデータから継承されます。私の質問、これを回避する方法はありますか?要素のサイズを掛けてインデックス値を補うことができますが、別の方法がありますか?
Here私がここで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);
}
事前に感謝します。
。もちろん、サイズでインデックスを分割する方が安全でないコードよりも好ましいかもしれません; -p –