VB.NET - serie di valori nulli
Domanda
Ho un valore stringa leggere da un file CSV. Il file CSV contiene 7 byte NULL
, mi hanno confermato questo aprendolo in un editor esadecimale e sicura d'accontentarvi ci sono 7 0x0
byte in là. Questa stringa sta causando dolore mi.
In vb.net quando controllo la strlen
di questa stringa restituisce un valore di 7 e se faccio un String.IsNullOrWhitespace
restituisce false
.
Non riesco a capire perché questo è? Ho diviso la stringa in una matrice di byte e ogni byte è 0x0
, che è nullo / nulla. Un confronto string = Nothing
riesce anche.
Voglio essere in grado di sostituire questa stringa con una stringa della mia, ma non posso fare questo in modo dinamico. Eventuali suggerimenti perché questo String Restituisce una lunghezza di 7 anche se ogni byte è 0x0
?
Soluzione
il carattere null non è uno spazio, e il vostro riferimento stringa non è nulla, quindi mi aspetterei String.IsNullOrWhitespace()
per tornare false
Altri suggerimenti
Purtroppo i tempi di sette caratteri null
non è una stringa vuota, o una stringa nulla. Ricordate che in .NET una stringa è a un certo livello di una puntatore a un array di caratteri . Una stringa è null se questo puntatore viene spostato nullo. Una stringa è vuota se il puntatore punta a un array di lunghezza zero. In questo caso i punti puntatore ad una lunghezza sette array di caratteri null (byte essendo tutti zeri).
stringa Null
A ->
stringa vuota ??p>
A -> ()
Il tuo Stringa
A -> ((0) (0) (0) (0) (0) (0) (0))
È possibile verificare per questo carattere null utilizzando
char nullChar = char.ConvertFromUtf32(0);
string nullCharString = new String(nullChar);
bool hasNullChar = A.Contains(nullCharString);
controlli IsNullEmptyOrWhitespace se la variabile stessa è nullo, non se la stringa contiene caratteri NULL. Un carattere NULL non è uno spazio bianco. Quindi questo controllo ha esito negativo anche.
Vi suggerisco di utilizzare un Trim (), dopo la prova. In C # questo sarà simile a:
bool MyNullCheck(string s) {
if (s == null) return false;
s = s.Trim(new string(char.ConvertFromUtf32(0), 1));
return string.IsNullEmptyOrWhiteSpace(s);
}
Prova a convertire in VB (non verificata)
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
Un personaggio con il codice di carattere zero è un personaggio come qualsiasi altro. Se si dispone di una stringa con sette tali caratteri, la lunghezza è di sette. Il carattere NUL non è un carattere spazio vuoto, e una stringa contenente caratteri NUL non è la stessa come riferimento stringa che è nullo (Nulla).
Si potrebbe utilizzare il metodo Trim
(o TrimEnd
) per rimuovere i caratteri NUL specificando che dovrebbe tagliare caratteri NUL: str = str.Trim(Chr(0))
, ma penso che si dovrebbe piuttosto chiedersi il motivo per cui non v'è caratteri NUL nella stringa per iniziare.
Stai leggendo i dati correttamente dal file? Un errore comune è quello di utilizzare il metodo Read
per leggere da un flusso, ma ignorando il suo valore di ritorno e finire con un tampone solo parzialmente riempito con dati dal flusso così. Come un array di byte è riempito con zeri al momento della creazione, il non byte impostato dall'operazione Read
rimarrebbe zero e diventare caratteri NUL quando si decodifica i dati in una stringa.
- A Null stringa è uno che non è stato inizializzato o è stato impostato
Nothing
. - Un vuoto stringa è quello che contiene la
String.Empty
stringa vuota o""
. - I caratteri di spaziatura sono lo spazio, tab, newline, ritorno a capo e molto altro ancora . Ma non il carattere null.
- La stringa non è né vuota né
Nothing
. Esso contiene 7 caratteri, ognuno è il carattere null -. Quindi non è uno spazio
Si potrebbe usare String.Replace per rimuovere le zero caratteri? Qualcosa di simile a questo
s = s.Replace(vbNullChar, "")
Scommetto che è stato eseguito in un problema di codifica. Provate a leggere il file come UTF-16