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


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

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

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

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

6 ответов:

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

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

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

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);

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

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

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

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

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

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

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

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

s = s.Replace(vbNullChar, "")

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