1

将来のプロジェクトでネットワーク プログラミングを簡素化するためのライブラリを作成しています。これは、将来のほぼすべてのプロジェクトで使用されるため、堅牢で効率的であることを望んでいます。(ところで、サーバーとクライアントの両方が私のライブラリを使用するので、私の質問ではプロトコルを想定していません)31バイトのバッファとセンチネル用に1つを使用するネットワークストリームから文字列を受信する関数を書いています。センチネル値は、EOF であるバイトがある場合、そのバイトを示します。これがあなたの使用または精査のための私のコードです...

public string getString()
    {
        string returnme = "";
        while (true)
        {
            int[] buff = new int[32];
            for (int i = 0; i < 32; i++)
            {
                buff[i] = ns.ReadByte();
            }
            if (buff[31] > 31) { /*throw some error*/}
            for (int i = 0; i < buff[31]; i++)
            {
                returnme += (char)buff[i];
            }
            if (buff[31] != 31)
            {
                break;
            }
        }
        return returnme;
    }

編集:これは、私がやっていることを達成するのに最適な(効率的、実用的など)ですか?

4

2 に答える 2

3

これは、私がやっていることを達成するのに最適な (効率的、実用的など) ですか?

いいえ。まず、コード ポイントの範囲が 0 ~ 255 の文字に制限されており、それでは十分ではありません。次に、文字列のシリアル化は解決済みの問題です。Encoding通常は UTF-8 を使用してください。ネットワークストリームの一部として、これはおそらく「長さをエンコードし、データをエンコードする」および「長さを読み取り、その量のデータをバッファリングし、データをデコードする」ことを意味します。ReadByte()別の注意として、負の値を返す場合、EOF シナリオを正しく処理していません。

小さな結果として、stringループ内で a に追加することは決して良い考えではないことに注意してください。そのようにした場合、を使用しStringBuilderます。しかし、そのようにしないでください。私のコードはもっと似たものになります(ねえ、知ってますか、これはprotobuf-netからの実際の文字列読み取りコードで、少し単純化されています):

// read the length         
int bytes = (int)ReadUInt32Variant(false);
if (bytes == 0) return "";

// buffer that much data
if (available < bytes) Ensure(bytes, true);

// read the string
string s = encoding.GetString(ioBuffer, ioIndex, bytes);

// update the internal buffer data
available -= bytes;
position += bytes;
ioIndex += bytes;
return s;

最後に、構造化されたメッセージを送信している場合は、このようなものに特化した事前にロールされたシリアライゼーション API を使用することを真剣に検討してください。たとえば、次のようなことができます。

var msg = new MyMessage { Name = "abc", Value = 123, IsMagic = true };
Serializer.SerializeWithLengthPrefix(networkStream, msg);

そしてもう一方の端で:

var msg = Serializer.DeserializeWithLengthPrefix<MyMessage>(networkStream);
Console.WriteLine(msg.Name); // etc

ジョブ完了。

于 2012-08-07T05:45:36.110 に答える
0

パフォーマンスを向上させるには、固定サイズの StringBuilder オブジェクトを使用する必要があると思います。

于 2012-08-07T05:44:18.457 に答える