我在正确使用 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,则索引仍对齐为字节[]。这意味着 idx16 1获取数据中的第二个字节,而不是第二个 16 位字(字节 2 和 3)。如果我做相反的我索引短裤而不是字节,这意味着偏移对齐是从源数据继承的。我的问题,有没有办法解决这个问题?我知道我可以通过乘以元素的大小来补偿索引值,但是还有其他方法吗?
这是我在 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);
}
提前谢谢了!