stream.Write(record, sizeof(record))
そのため、さまざまなタイプのレコードを取得し、名前付きパイプを介してメモリストリームにスローし、送信する 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、double の場合は 8 バイト
0xBC、0x44、0xE4、0x40、
0xA3、0x02、0x00、0x00、SVNChangeSet に 2 バイト、アライメントに 2 バイト?
0x00、0x00、2 バイトは別の何かに?
アライメントに関する質問
- これは 4 バイト境界でのアラインメントと呼ばれるものだと思いますよね?
- 最後の 2 バイトは何ですか?
今、これを 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# に関する質問
- これはまったく機能せず、アライメントを説明する方法がわかりません。明示的なオフセットを試しましたが、不足しています。
- 多くのレコード タイプがあり、他のレコードの動的配列であるメンバーを持つものもあります。これらのバイト配列を構造体またはオブジェクトに変換するための堅牢なソリューションを思いつきたいと思います。