Така че имам приложение на Delphi, което взема записи от различни типове, хвърля ги в поток от памет чрез stream.Write(record, sizeof(record))
и ги изпраща по наименована тръба.
Вземете този запис на 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, 8 байта за двойно
0xBC, 0x44, 0xE4, 0x40,
0xA3, 0x02, 0x00, 0x00, 2 байта за SVNChangeSet, 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#
- Това просто не работи и не мога наистина да разбера как да отчитам подравняването. Опитах явни компенсации, но не ми достига.
- Имам много типове записи, някои с членове, които са динамични масиви от други записи. Предпочитам да измисля стабилно решение за преобразуване на тези масиви от байтове в структури или обекти.
array[0..4] of Byte
съдържа 5 байта, а не 4. Какво е SizeOf(record) в Delphi? Предполагам, че е 20, а не 22. - person nullptr   schedule 01.09.2013