因此,我有一個Delphi應用程序,它將各種類型的記錄,通過stream.Write(record, sizeof(record))
扔到內存流中,並通過命名管道發送它們。1:1 C#結構與流式Delphi記錄的對齊可能嗎?
藉此Delphi的記錄:
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的,用於雙
0xBC,0×44,0xE4,0x40的8個字節,
0xA3執行,0×02,0x00時,0×00,2個字節用於SVNChangeSet,2字節對齊?
0x00,0x00,2個字節的其他東西?
對齊問題
- 我相信這就是所謂的定位在4個字節的boundries,是否正確?
- 什麼是最後兩個字節?
現在我試圖(不成功)將這個元素編入到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#問題
- 這根本不起作用,我真的不能弄清楚如何解釋對齊。我已經嘗試了明確的偏移量,但是我會縮短。
- 我有很多記錄類型,其中一些成員是其他記錄的動態數組。我寧願想出一個強大的解決方案來將這些字節數組轉換爲結構或對象。
順便說一下,Byte'的array [0..4]包含5個字節,而不是4.什麼是Delphi中的SizeOf(記錄)?我猜這是20,而不是22. – Inspired
Delphi 2007和XE4中的SizeOf(TAboutData)都給出了24,這與填充有關。 –