所以我有一个 Delphi 应用程序,它正在获取各种类型的记录,将它们扔到内存流中,stream.Write(record, sizeof(record))
并通过命名管道发送它们。
拿这个德尔福记录:
Type TAboutData = record
Version : array[0..4] of Byte;
Build : Word;
BuildDate : TDateTime;
SVNChangeset : Word;
end;
当它通过命名管道发送时,它在 byte[] 数组中如下所示:
长度:22 字节
0x06, 0x00, 0x00, 0x00, 4 字节的数组
0x00, 0x00, 0x00, 0x00, 2 个字节用于构建,2 个字节用于对齐?
0x15, 0xA3, 0x86, 0x3F, 8 字节为双精度
0xBC、0x44、0xE4、0x40、
0xA3, 0x02, 0x00, 0x00, SVNChangeSet 2 个字节,2 个字节对齐?
0x00, 0x00, 2 个字节用于别的什么?
对齐问题
- 我相信这被称为 4 字节边界对齐,对吗?
- 最后两个字节是干什么用的?
现在我正在尝试(不成功)将其编组为 C# 结构。
[StructLayout(LayoutKind.Sequential)]
struct TAboutInfo
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public byte[] Version;
public ushort Build;
public double BuildDate;
public ushort SVNChangeSet;
}
IntPtr ptr = Marshal.AllocHGlobal(bytebuffer.Length);
Marshal.Copy(ptr, bytebuffer, 0, bytebuffer.Length);
TAboutInfo ta = (TAboutInfo)Marshal.PtrToStructure(ptr, typeof(TAboutInfo));
Marshal.FreeHGlobal(ptr);
C# 问题
- 这根本行不通,我真的不知道如何解释对齐。我已经尝试过明确的偏移量,但我做不到。
- 我有许多记录类型,其中一些成员是其他记录的动态数组。我宁愿想出一个强大的解决方案来将这些字节数组转换为结构或对象。