Итак, у меня есть приложение 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 (запись) в Delphi? Я думаю, это 20, а не 22. - person nullptr   schedule 01.09.2013