0
// Reads NetworkStream into a byte buffer.

NetworkStream ns;
System.Net.Sockets.TcpClient client = new TcpClient();

byte[] receiveBytes = new byte[client.ReceiveBufferSize];
ns.Read(receiveBytes, 0, (int)client.ReceiveBufferSize);
String returndata = Encoding.UTF8.GetString(receiveBytes);

クライアントから正常に読み取り、結果を returndata という文字列に格納しています。ただし、returndata を何かと連結しようとすると、連結が行われません。例: String.Concat(returndata, "test") は、returndata + "test" と同様に、returndata を返します。

なぜこれが起こっているのか誰にも分かりますか?

編集: Steve W は正しいです。後で、returndata.Length が常に 8192 を返していることがわかりました。

4

5 に答える 5

5

jhunter の回答を拡張するには、Concat メソッドは元の文字列変数の内容を変更せず、連結された結果を返すだけです。returndata に連結の結果を含めたい場合は、 を使用する必要がありますreturndata = string.Concat(returndata, "test")

于 2009-02-13T19:59:03.237 に答える
5

それを文字列に割り当てていますか、それともそれ自体に戻していますか?

returndata = string.Concat(returndata, "test");
returndata += "test";
于 2009-02-13T19:56:03.213 に答える
4

この問題は、読み取られた合計バイト数を追跡​​していないことに関連していると思います。ReceiveBufferSize に設定されたバイト バッファーは、実際に読み取られたバイト数よりも大きい可能性があります。実際に読み取られたバイト数を考慮して Encoding.UTF8.GetString() メソッドに渡すことで、連結可能な有効な文字列を取得する必要があります。次に例を示します。


NetworkStream ns;
System.Net.Sockets.TcpClient client = new TcpClient();

byte[] receiveBytes = new byte[client.ReceiveBufferSize];
int bytesRead = ns.Read(receiveBytes, 0, receiveBytes.Length);
String returndata = Encoding.UTF8.GetString(receiveBytes,0,bytesRead);
returndata = returndata.Trim(new char[] {'\0'});

null ターミネータを読み取り、それを読み取りバイトに含めることに関する他の提案も問題になる可能性があることに注意してください。null ターミネータが確実に削除されるように、文字列の Trim を含めました。

于 2009-02-13T20:19:03.393 に答える
3

私は推測します:

受信した文字列には、'\0' ターミネータが含まれています。デバッガで確認できるはずです。

于 2009-02-13T19:58:57.653 に答える
2

文字列は不変です。これは、別の文字列を文字列に追加 (連結) すると、新しい文字列インスタンスを受け取ることを意味します。
元の文字列自体は変更されません。

于 2009-02-13T19:58:23.380 に答える