VB.NET — строка нулей

У меня есть строковое значение, считанное из файла CSV. Файл CSV содержит 7 NULL байт, я подтвердил это, открыв его в шестнадцатеричном редакторе, и, конечно же, там 7 0x0 байт. Эта струна причиняет мне боль.

В vb.net, когда я проверяю strlen этой строки, он возвращает значение 7, а если я делаю String.IsNullOrWhitespace, он возвращает false.

Я не могу понять, почему это? Я разделил строку на массив байтов, и каждый байт равен 0x0, что равно нулю/ничего. Сравнение string = Nothing также не удается.

Я хочу иметь возможность заменить эту строку своей собственной строкой, но я не могу сделать это динамически. Любые предложения, почему эта строка возвращает длину 7, хотя каждый байт равен 0x0?


person WizardsSleeve    schedule 29.06.2010    source источник
comment
Пример вашего кода был бы полезен.   -  person Justin Niessner    schedule 29.06.2010


Ответы (6)


Нулевой символ не является пробелом, и ваша ссылка на строку не является ничем, поэтому я ожидаю, что String.IsNullOrWhitespace() вернет false

person Rowland Shaw    schedule 29.06.2010
comment
Итак, если это так, как мне проверить строку символов NULL? - person WizardsSleeve; 29.06.2010
comment
Вам нужно будет либо преобразовать их во что-то другое, например, используя yourstring = yourstring.Replace( Chr(0), " "c ) для преобразования в пробелы, либо перебрать строку и проверить себя. - person Rowland Shaw; 29.06.2010

К сожалению, символ null семь раз не является пустой строкой или нулевой строкой. Помните, что в .NET строка на каком-то уровне является указателем на массив символов. . Строка является нулевой, если этот указатель установлен в нуль. Строка пуста, если указатель указывает на массив нулевой длины. В этом случае указатель указывает на массив нулевых символов длиной семь (байт состоит из нулей).

Нулевая строка

A ->

Пустой строки

A -> ()

Ваша строка

A -> ((0)(0)(0)(0)(0)(0)(0))

Вы можете проверить этот нулевой символ, используя

char nullChar = char.ConvertFromUtf32(0);
string nullCharString = new String(nullChar);
bool hasNullChar = A.Contains(nullCharString);
person C. Ross    schedule 29.06.2010

Символ с нулевым кодом символа является таким же символом, как и любой другой. Если у вас есть строка с семью такими символами, длина равна семи. Символ NUL не является символом пробела, и строка, содержащая символы NUL, не совпадает со строковой ссылкой, которая имеет значение null (ничего).

Вы можете использовать метод Trim (или TrimEnd) для удаления символов NUL, указав, что он должен обрезать символы NUL: str = str.Trim(Chr(0)), но я думаю, что вам лучше спросить себя, почему в строке для начала есть символы NUL.

Вы правильно читаете данные из файла? Распространенной ошибкой является использование метода Read для чтения из потока, но игнорирование его возвращаемого значения и, таким образом, получение буфера, лишь частично заполненного данными из потока. Поскольку массив байтов заполняется нулями при его создании, байты, не установленные операцией Read, останутся нулевыми и станут символами NUL при декодировании данных в строку.

person Guffa    schedule 29.06.2010
comment
Строка поступает из вывода другой программы, над которой я не контролирую. Я правильно читаю, так как проверил содержимое файла с помощью шестнадцатеричного редактора. - person WizardsSleeve; 29.06.2010
comment
@WizardsSleeve: Хорошо, если вы уверены, что можете безопасно игнорировать символы NUL, вы можете просто вырезать их из строки. Если строка содержит только символы NUL, после этого вы получите пустую строку. - person Guffa; 29.06.2010

IsNullEmptyOrWhitespace проверяет, является ли сама переменная нулевой, а не содержит ли строка символы NULL. Символ NULL не является пробелом. Так что эта проверка тоже не проходит.

Я предлагаю вам использовать Trim() после теста. В С# это будет выглядеть так:

bool MyNullCheck(string s) {
    if (s == null) return false;
    s = s.Trim(new string(char.ConvertFromUtf32(0), 1));
    return string.IsNullEmptyOrWhiteSpace(s);
}

Попробуйте конвертировать в VB (не проверено)

Function MyNullCheck(s as String) as Boolean
  If s Is Nothing Then
     Return False
  End If
  s = s.Trim(New String(vbNullChar, 1))
  Return String.IsNullEmptyOrWhiteSpace(s)
End Function
person GvS    schedule 29.06.2010

  • Строка null – это строка, которая не была инициализирована или для которой задано значение Nothing.
  • Пустая строка содержит пустую строку String.Empty или "".
  • Пробелы — это пробел, табуляция, перевод строки, возврат каретки и многое другое. . Но не нулевой символ.
  • Ваша строка не пуста и не Nothing. Он содержит 7 символов, каждый из которых является нулевым символом, поэтому это не пробел.

Вы можете использовать String.Replace, чтобы удалить нулевой персонажи? Что-то вроде этого

s = s.Replace(vbNullChar, "")
person MarkJ    schedule 29.06.2010

Бьюсь об заклад, вы столкнулись с проблемой кодировки. Попробуйте прочитать файл как UTF-16

person erikkallen    schedule 29.06.2010