0

バイナリシリアル化されたネットワークパケットを受信するプログラムがあります。現在、ポインタを使用して、バイト配列から構造体にデータを直接格納する方法があります。しかし、私が今必要としているのは、バイト配列からコピーする簡単な方法を維持しながら、構造体にもUTF文字列を格納する方法です。文字列の前には、文字列のバイト単位の長さを示すunsignedshortが付いていると見なされます。これは、C#が内部でchar []または文字列を格納する方法ですか、それとも格納するために独自の構造体を作成する必要がありますか?

私の現在の構造体レイアウトは次のようになります。

public struct GenericPacket
{
    public short packetid;

    public static GenericPacket ReadUsingPointer(byte[] data)
    {
        unsafe
        {
            fixed (byte* packet = &data[0])
            {
                return *(GenericPacket*)packet;
            }
        }
    }
}

ポインタを使用した読み取りは、単にバイト配列を受け取り、それにポインタを返しますが、GenericStructとして返します。これはすべての通常のタイプで機能しますが、文字列はより複雑です。

アイデアをありがとう!

4

3 に答える 3

0

このように char[] から文字列を作成できます

char[] foo = new char[] {'a','b','c','d'}
string bar = new string(foo);

これを範囲指定された配列のコピーと組み合わせて、より大きなバイト ブロックから文字列を抽出します。

これは System.Text.Encoding.GetString(byte[] data, int start, int length) が実際に内部で行うことだと思いますが、.NET Micro Framework ではこれを利用できないため、詳しく説明する必要があります。

于 2012-07-10T06:20:42.833 に答える
0

これは BSTR であり、BSTR メソッドはそれに対して機能します (Win32 および Win32 互換性ライブラリで利用可能) - 文字は複数のバイトになる可能性があるため、プレフィックスが文字数ではなくバイトを参照する場合。BSTR はそのことを知りません。

C 文字列はプレフィックスなしで null で終了します。C++ および C# 文字列は実装定義のストレージを使用しますが、通常は別の長さパラメーターを持つ配列を使用します。それらは間違いなく BSTR ではありません。

于 2012-07-10T06:18:04.163 に答える
0

文字列を返す System.Text.Encoding.GetString(byte[]) または System.Text.Encoding.UTF8.GetString(byte[]) を使用できます。

于 2012-07-10T06:19:19.547 に答える