我在用这个砸我的头。我有一个C#结构:
[StructLayout(LayoutKind.Sequential)]
public struct Enroll
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 101)]
public char[] Name;
public UInt16 Port;
public byte Num;
public byte Max;
public UInt64 Version;
public byte TS;
public byte Avg;
public byte Flags;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public char[] Tag;
}
总计为132个字节。然而,
S.Enroll X = new();
int size = Marshal.SizeOf(X);
计算144个字节,从而阻止我成功地将字节映射到结构。
发送方是一个C++应用程序,其结构声明如下:
struct Enroll
{
public:
char Name[101] = { 0 };
uint16 Port = 0;
uint8 Num = 0;
uint8 Max = 0;
uint64 Version = 0;
uint8 TS = 0;
uint8 Avg = 0;
DevFlags Flags = DevFlags ::None;
char Tag[16] = { 0 };
};
这导致了实际的132个字节,我可以一个一个地读取。
我遗漏了什么?
谢谢
发布于 2021-05-19 09:35:32
正如马修沃森所建议的,Pack=1解决了我的问题。Sinatr的链接解释道:
Pack字段控制内存中类型字段的对齐。它影响LayoutKind.Sequential。默认情况下,值为0,指示当前平台的默认打包大小。Pack的值必须为0、1、2、4、8、16、32、64或128: 类型实例的字段通过使用以下规则对齐: 类型的对齐是其最大元素(1、2、4、8等字节)的大小或指定的包装大小,以较小者为准。 每个字段必须与其自身大小的字段(1、2、4、8等字节)或类型的对齐对齐,以较小的字段为准。由于类型的默认对齐方式是其最大元素的大小,该元素大于或等于所有其他字段长度,这通常意味着字段按其大小对齐。例如,即使类型中最大的字段是64位(8字节)整数或Pack字段设置为8,字节字段在1字节边界上对齐,Int16字段在2字节边界上对齐,Int32字段在4字节边界上对齐。 在字段之间添加填充以满足对齐要求。
https://stackoverflow.com/questions/67600207
复制相似问题