C # строка не будет объединена - PullRequest
0 голосов
/ 13 февраля 2009
// 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, как и returndata + "test".

Кто-нибудь знает, почему это происходит?

Редактировать: Стив W прав; позже я узнал, что returndata.Length всегда возвращал 8192.

Ответы [ 5 ]

5 голосов
/ 13 февраля 2009

Чтобы расширить ответ jhunter, метод Concat не изменяет содержимое исходной строковой переменной, он просто возвращает объединенный результат. Если вы хотите, чтобы returndata содержал результат конкатенации, вам нужно использовать returndata = string.Concat(returndata, "test").

5 голосов
/ 13 февраля 2009

Вы назначаете его на строку или обратно на себя?

returndata = string.Concat(returndata, "test");
returndata += "test";
4 голосов
/ 13 февраля 2009

Я полагаю, что проблема связана с не отслеживанием общего количества прочитанных байтов. Ваш байтовый буфер, установленный на 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'});

Обратите внимание также на другое предложение о чтении нулевого терминатора и включении его в прочитанные байты, также может быть проблемой. Я включил обрезку строки, чтобы убедиться, что нулевые терминаторы удалены.

3 голосов
/ 13 февраля 2009

У меня будет предположение:

Полученная строка содержит терминатор '\ 0'. Вы должны быть в состоянии проверить это с помощью отладчика.

2 голосов
/ 13 февраля 2009

Строки неизменны. это означает, что когда вы добавляете (объединяете) другую строку в вашу строку, вы получаете новый экземпляр строки.
Сама оригинальная строка не будет изменена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...