Строка не печатается, как ожидалось

Не могли бы вы объяснить, почему окно вывода не печатает часть строки «xxxxx»? Похоже, я что-то упускаю из виду...?

Я отправляю строковые сообщения через TcpClient, и при создании строк я не добавляю никаких специальных символов ни на стороне отправителя, ни на стороне получателя. Это часть проблемы?

http://i56.tinypic.com/9lg7pi.png

введите здесь описание изображения


ИЗМЕНИТЬ:

Я строю свои строки на стороне отправителя следующим образом:

Private Sub SendData(ByVal stringArray As String())
    SendData(GetMessageString(stringArray))
End Sub

Public Function GetMessageString(ByVal array As String()) As String
    Dim str As String = ""
    For i = 0 To array.Length - 1
        str = str & array(i)
        If i < array.Length - 1 Then
            str = str & "|"
        End If
    Next
    Return str
End Function

А на принимающей стороне строится переменная:

     client.GetStream.BeginRead(readBodyBuffer, 0, MESSAGE_BODY_LENGTH, New AsyncCallback(AddressOf ReadBody), Nothing)

    ...

Private Sub ReadBody(ByVal aread As IAsyncResult)

      BytesRead = client.GetStream.EndRead(aread)

    ...

          ' Read (add) into buffer
      messagePart = Encoding.ASCII.GetString(readBodyBuffer)
      messagePart = messagePart & "xxxxx"

ИЗМЕНИТЬ 3

Моей простой ошибкой было неправильное использование Redim массива байтов: (параметр 10 дает 11 элементов)

Неправильный:

 ReDim readBodyBuffer(MESSAGE_BODY_LENGTH)

Правильный:

 ReDim readBodyBuffer(MESSAGE_BODY_LENGTH - 1)

person bretddog    schedule 28.03.2011    source источник


Ответы (2)


Я считаю, что это как-то связано с непечатными символами. Например, этот код С#:

string message = "Hello\0 Hello2";
Debug.Print(message);

Здесь у меня есть строка с нулевым символом в конце. В визуализаторе отладки она отображается так же, как я создал эту строку — "Hello\0 Hello2". Но в окне вывода он не отображает \0 и даже обрезает Hello 2. Поэтому я думаю, что это относится к вашей проблеме, хотя я не смог воспроизвести ее полностью. Проверьте свой messagePart.Length.

ОБНОВЛЕНИЕ: Итак, просмотрев все эти комментарии здесь и в другом ответе, я думаю, что проблема вызвана неправильным использованием readBodyBuffer. Это зависит от того, как вы выделяете этот буфер, но я ожидаю, что вы просто создаете новый массив байтов с фиксированной (11) длиной. Затем вы игнорируете количество фактически полученных байтов (10) и конвертируете строку из этого массива с использованием кодировки ASCII. Тот факт, что BytesRead меньше выделенного размера буфера, приводит к тому, что последний байт в массиве равен нулю. Вы должны использовать метод Encoding.ASCII.GetString, который принимает аргумент length, поэтому вы не получите \0 в строке результата:

messagePart = Encoding.ASCII.GetString(readBodyBuffer, 0, ReadBytes)
person Snowbear    schedule 28.03.2011
comment
Хм... Да, длина messagePart составляет 16, что на один символ больше, чем я ожидал. Хотя я не знаю, где это добавлено? Я отредактировал некоторые подробности о том, как обрабатываются строки выше. - person bretddog; 28.03.2011
comment
@bretddog, можешь сбросить содержимое readBodyBuffer? Подозреваю, что проблема в 10 index. - person Snowbear; 28.03.2011
comment
@Snowbear: Извините, что вы имеете в виду, сбросить содержимое? Строка ПОДКЛЮЧЕНА| - person bretddog; 28.03.2011
comment
@bretddog, я имею в виду, что вы должны распечатать содержимое массива readBodyBuffer. Это должно быть что-то вроде [67, 79, ... - person Snowbear; 28.03.2011
comment
Я понимаю. Он печатает: 67 79 78 78 69 67 84 69 68 124 0 - person bretddog; 28.03.2011
comment
Итак, readBodyBuffer.Length = 11, а переменная BytesRead = 10 - person bretddog; 28.03.2011
comment
А.. Спасибо! :) Теперь я вижу свою ошибку. Я отправляю длину сообщения в начале каждого сообщения, чтобы обеспечить динамическую длину сообщения, например: 000010CONNECTED| Но моя ошибка связана с Redim: я думал, что Redim readBuffer(10) дает 10 элементов (0-9), но он дает 11 (0-10). хм.. краснеть - person bretddog; 28.03.2011

Согласен со Снежком.

Не могли бы вы напечатать символьный код пробела в своем сообщении? Должно быть 32 для пробела.

Debug.Print(AscW(messagePart(10)))
person Mikhail G    schedule 28.03.2011
comment
Не знаю, что это значит, но если я напечатаю: Debug.Print(AscW(messagePart)) выведет 67 ? - person bretddog; 28.03.2011
comment
@bretddog - 67 - это код ascii C char, который является первым символом в вашей строке, вам нужно напечатать код ascii для индекса 10 в messagePart - person Snowbear; 28.03.2011
comment
Этот ноль является проблемой при использовании функции Debug.Print. Чтобы обойти эту проблему, вы можете удалить или заменить этот ноль перед передачей функции. Вот так: message.Replace(ChrW(0), ) - person Mikhail G; 28.03.2011
comment
Ясно.. Но почему там вообще ноль? И должен ли я удалить его из конца каждой полученной строки при построении сообщения из нескольких частей? - person bretddog; 28.03.2011
comment
Пожалуйста, не считайте обходной путь хорошим решением. Вероятно, нулевой символ в конце сообщения может вызвать проблемы и в других частях системы. Это хорошее время, чтобы обобщить все детали и принять решение. - person Mikhail G; 28.03.2011