Получение всего вывода строки, содержащей chr(0)

#.net #vb.net

Вопрос:

Вот образец:

     Dim TestString As String = "Hello," amp; Chr(0) amp; "World"
    MsgBox(TestString, , "TestString.Length=" amp; TestString.Length.ToString)
 

Результат — в окне сообщений отображается «Привет», а в заголовке написано «Тестовая строка».Длина=12

Я предполагаю, что chr(0) рассматривается как конец строки с нулевым окончанием, но это не то, что я хочу.

Какой правильный метод работы с Chr(0) ?


Я также пробовал это в asp.net безрезультатно. Я посылаю строку через сокет. Моя проблема в том, что когда я отлаживаю его, вся строка не складывается. Мне нужно отправить им довольно большую строку для этого. То, что на самом деле появляется в окне сообщения, меня не беспокоит. Я использовал вышесказанное в качестве примера. Мне просто нужно при вводе нескольких переменных, которые он правильно добавляет в строку. Другим примером этого может быть

 "SCORE".ToString.PadRight(8, chr(0)) amp; "3.0".ToString.PadRight(10, chr(0)) amp; "0".ToString.PadRight(1, "0")
 

ожидаемое значение будет равно 3,00

Что я получаю, так это оценку 3,0

Ответ №1:

Пример кода в примере задающего вопрос («ОЦЕНКА».toString…) отлично работает для меня в консольном приложении. Отладчик VS2005 не отображает строку правильно, но он отлично выводит данные на консоль. Таким образом, у меня такое чувство, что либо вы считаете это неправильным, потому что отладчик ошибочно так говорит, либо ваша выходная строка недостаточно длинная, чтобы включить все заполнение.

Ответ №2:

Вы абсолютно правы в том, что Chr(0) рассматривается как управляющий символ, означающий «это конец этой строки». Как бы вы предпочли, чтобы был представлен этот персонаж? Место? Новая строка? Вам нужно напечатать только строку целиком, или в строке есть другие важные вещи?

Я бы просто позвонил TestString.Replace(chr(0), " ") или что-то в этом роде VB.NET

Ответ №3:

Я не думаю, что проблема в строке vb, о чем свидетельствует вывод вашей длины. Я думаю, что это связано с функцией MsgBox, которая, вероятно, все еще использует API Windows, который рассматривает символ(0) как терминатор.

Если ваша отладка или что-то в этом роде, и вы хотите представить, что есть символ(0), вы должны заменить его набором символов для печати, который, как вы понимаете, представляет символ(0).

Ответ №4:

MsgBox, скорее всего, использует функцию Windows API MessageBox, которая использует строку, заканчивающуюся нулем, и, таким образом, будет отображаться только до первого нуля. Большинство API Windows работает(если не все?) со строкой, заканчивающейся нулем, поэтому вам, возможно, придется найти другой способ отображения строки.

Ваши средства отладки (например, visual studio) также могут обрабатывать строки как завершенные нулем, которые снова будут отображаться только до первого нуля (однако я в этом не уверен и в настоящее время не нахожусь на компьютере, на котором я могу протестировать его для vs08).

Ответ №5:

Действительно, Chr(0) используется для завершения строки, если вам нужен символ новой строки, вы можете использовать Environment.NewLine() в VB.NET или vbNewLine в VB6

Ответ №6:

Похоже, что VB правильно обрабатывает строку, потому что знает правильную длину (12), поэтому проблема только в том, когда вы отображаете строку. Можете ли вы заменить chr(0) пробелом только тогда, когда вы хотите его отобразить?

Ответ №7:

Взгляните на статью Джона Скита о строках. Похоже, что тестовая строка будет содержать все символы, включая встроенный , но она отображается неправильно. Статья включает функцию (на c#), которая правильно отображает строку.

Ответ №8:

значение chr(0) равно нулю. Вы после одного пробела chr(32) или просто введите vblf или после ввода(возврата) chr(13) или введите vbcrlf

Комментарии:

1. Просто чтобы быть раздражительным: chr(0) равно НУЛЮ. NUL и null-это совершенно разные понятия, даже если они оба равны нулю.

2. Ха — ты каждый день узнаешь что-то новое. Спасибо, что предупредили!

Ответ №9:

Используйте атрибут MarshalAs в объявлениях процедур, которые возвращают строки, содержащие chr(0), как показано ниже

 <DllImport("my.dll", ... )> _
Sub modifyStr(<MarshalAs(UnmanagedType.BStr)> ByRef stringContainingNullChars as String)