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, "")