TCP ソケット経由でネットワーク デバイスからデータを読み取り、これを C# 構造に変換するサービス (C#) を開発する必要があります。
私は、このすべてを行っている既存の古い Delphi アプリケーションに基づいており、C# でロジックを移行する必要があります。
編集: 元のデータ構造の C ソースからスナップショットを取得しました:
struct _RequestMsgStruct
{
UCHAR request_ver; //In DELPHI it is represented as Byte
USHORT mac_addr[3]; /* MAC Address */
UINT product_type; //In DELPHI - Cardinal
UCHAR supply_type; //In DELPHI - Byte
short reserved0; //In DELPHI - SmallInt
UCHAR oper_ver[4]; //In DELPHI - CARDINAL !!!
USHORT brd_id; //In DELPHI - WORD
unsigned short exp_id1; //In DELPHI - WORD
//In DELPHI - string[15]; //Array [0..15] of char;
UCHAR serial_no[16]; /* Serial Number. 16th char have to be NULL */
UCHAR _name[32]; /* Name */ //Length of payload may vary //In DELPHI - string[31]
float data_avg; //In DELPHI - Single
ULONG key[5]; //In DELPHI - array [0..19] of Byte
}__attribute__ ((packed));
さまざまなタイプの 200 以上のフィールドを持つ Delphi Packed レコードがあります...おおよそ次のようになります。
TREC_DATA = packed record
ID : Byte;
MAC_ADDRESS : array [0..5] of Byte;
fieldCard : cardinal;
fieldSI : SmallInt;
fieldW : WORD;
SERIAL_NUMBER : string[15]; //Array [0..15] of char;
fieldSingle : Single;
fieldArrOfB : array [0..19] of Byte;
end;
Delphi でバイト配列を構造体に移動するには、次のコードがあります。
Move(inBytesArr[StartIdx], DelphiStruct, aMsgSize)
文字列ファイル (SERIAL_NUMBER など) を変換するには、次のようなコードもあります。
var
pc: Pchar;
...
pc := @inBytesArr[StartIdx + SerialN_Pos_Idx];
DelphiStruct.SERIAL_NUMBER := pc;
私はそのような変換に初めて対処しましたが、どこから始めればよいかわかりません:
この構造をC#に変換するには? --
LayoutKind.Sequential
またはLayoutKind.Explicit
、または wiyhout[FieldOffset(N)]
属性を使用する必要がありますか? -- ターゲットの C# 構造体でバイト配列を宣言するにはどうすればよいですか:fixed
バッファとして、または[MarshalAs(UnmanagedType.ByValArray...)]
属性を使用して?Marshal.PtrToStructure
GCHandle.Alloc(bytes, GCHandleType.Pinned) +を使用して、入力バイト配列を最終的な C# 構造にマーシャリングするより良い方法はどれAddrOfPinnedObject
ですか
少なくとも、私がどこから始めなければならないかを控えめにするための出発点を得るのを手伝ってください。