Строка не печатается должным образом - PullRequest
2 голосов
/ 28 марта 2011

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

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

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

enter image description here


РЕДАКТИРОВАТЬ:

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

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)

Ответы [ 2 ]

2 голосов
/ 28 марта 2011

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

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)
0 голосов
/ 28 марта 2011

Согласен со Snowbear.

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

Debug.Print(AscW(messagePart(10)))
...