4

私は2つのメンバーを持つC#の構造を持っています:

public int commandID;  
public string MsgData;  

これらの両方を単一のバイト配列に変換する必要があります。これは、バイトをアンパックする C++ プログラムに送信され、最初の `sizeof(int) バイトを取得して commandID を取得し、残りの MsgData が使用されます。 .

c# でこれを行う良い方法は何ですか?

4

3 に答える 3

4

次の例では、通常のバイト配列が返されます。最初の 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 ++コンシューマーが反対側の文字列を解釈できる限り。

于 2012-10-02T12:08:40.140 に答える
1

これは直接バイト配列に送られます。

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;
}
于 2012-10-02T11:58:01.040 に答える
0

これはあなたがbyte[]望むものを手に入れるでしょう。ここで注意すべきことの1つは、非常に生の文字列が必要であり、OOBとまったく同じようにシリアル化できるシリアライザー(私が知っている)がないため、シリアライザーを使用しなかったことです。ただし、これは非常に単純なシリアル化であり、これはより理にかなっています。

var bytes = Encoding.UTF8.GetBytes(string.Format("commandID={0};MsgData={1}", o.commandID, o.MsgData));

最後に、私にはわからないプロパティが他にもある場合は、リフレクションを使用できます。

于 2012-10-02T11:58:40.410 に答える