VB.NET -строка нулей
У меня есть строковое значение, считанное из файла CSV. CSV-файл содержит 7 NULL байт, я подтвердил это, открыв его в шестнадцатеричном редакторе и убедившись, что там достаточно 7 0x0 байт. Эта струна причиняет мне боль.
В vb.net когда я проверяю strlen этой строки, она возвращает значение 7, а если я делаю String.IsNullOrWhitespace, то она возвращает false.
Я не могу понять, почему это так? Я разделил строку на массив байтов, и каждый байт равен 0x0, что равно null/nothing. A string = Nothing сравнение также терпит неудачу.
0x0?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, "")