私は2つのメンバーを持つC#の構造を持っています:
public int commandID;
public string MsgData;
これらの両方を単一のバイト配列に変換する必要があります。これは、バイトをアンパックする C++ プログラムに送信され、最初の `sizeof(int) バイトを取得して commandID を取得し、残りの MsgData が使用されます。 .
c# でこれを行う良い方法は何ですか?
私は2つのメンバーを持つC#の構造を持っています:
public int commandID;
public string MsgData;
これらの両方を単一のバイト配列に変換する必要があります。これは、バイトをアンパックする C++ プログラムに送信され、最初の `sizeof(int) バイトを取得して commandID を取得し、残りの MsgData が使用されます。 .
c# でこれを行う良い方法は何ですか?
次の例では、通常のバイト配列が返されます。最初の 4 つはコマンド ID を表し、残りはメッセージ データを表し、ASCII エンコードされゼロで終了します。
static byte[] GetCommandBytes(Command c)
{
var command = BitConverter.GetBytes(c.commandID);
var data = Encoding.UTF8.GetBytes(c.MsgData);
var both = command.Concat(data).Concat(new byte[1]).ToArray();
return both;
}
Encoding.UTF8
たとえば、必要に応じて切り替えることができEncoding.ASCII
ます-C ++コンシューマーが反対側の文字列を解釈できる限り。
これは直接バイト配列に送られます。
public byte[] ToByteArray(int commandID, string MsgData)
{
byte[] result = new byte[4 + MsgData.Length];
result[0] = (byte)(commandID & 0xFF);
result[1] = (byte)(commandID >> 8 & 0xFF);
result[2] = (byte)(commandID >> 16 & 0xFF);
result[3] = (byte)(commandID >> 24 & 0xFF);
Encoding.ASCII.GetBytes(MsgData.ToArray(), 0, MsgData.Length, result, 4);
return result;
}
これはあなたがbyte[]
望むものを手に入れるでしょう。ここで注意すべきことの1つは、非常に生の文字列が必要であり、OOBとまったく同じようにシリアル化できるシリアライザー(私が知っている)がないため、シリアライザーを使用しなかったことです。ただし、これは非常に単純なシリアル化であり、これはより理にかなっています。
var bytes = Encoding.UTF8.GetBytes(string.Format("commandID={0};MsgData={1}", o.commandID, o.MsgData));
最後に、私にはわからないプロパティが他にもある場合は、リフレクションを使用できます。