2009-09-09 2 views
22

Ho un array di byte simile a questo (16 byte):La stringa dall'array di byte non viene ritagliata in C#?

71 77 65 72 74 79 00 00 00 00 00 00 00 00 00 00 

utilizzo questa per convertirlo in una stringa e tagliare gli spazi chiusi:

ASCIIEncoding.ASCII.GetString(data).Trim(); 

ottengo la stringa fine, tuttavia ha ancora tutti gli spazi finali. Quindi ottengo qualcosa come "qwerty.........." (dove i punti sono spazi dovuti a StackOverflow).

Cosa sto sbagliando?

Ho anche provato a usare .TrimEnd() e ad usare una codifica UTF8, ma non cambia nulla.

Grazie in anticipo :)

+3

Il vostro array di byte finiscono in 00 byte o 20 byte? Uno spazio è 0x20 non 0x00. –

+1

Se il tuo array di byte proviene da un MemoryStream, assicurati di chiamare 'ToArray()' e non 'GetBuffer()', dato che GetBuffer includerà dati "non riempiti", risultando in tutti quei '\ 0 ' –

risposta

31

quello che dovete fare TrimEnd(new char[] { (char)0 }); per risolvere questo problema. Non sono spazi: sono in realtà caratteri nulli che vengono convertiti in modo strano. Ho avuto anche questo problema.

+6

terminatori nulli non hanno nulla da fare con la codifica ASCII. Sembra che @Lazlo abbia una matrice di byte a dimensione fissa che contiene una stringa codificata ASCII a lunghezza variabile, quindi la stringa deve essere riempita con terminatori null per corrispondere alla dimensione dell'array – dtb

+0

@dtb: Right. Giusto giusto. –

+0

Grazie :) Ho pensato che fosse qualcosa del genere, ma non osavo provarci. – Lazlo

20

non sono realmente gli spazi:

System.Text.Encoding.ASCII.GetString(byteArray).TrimEnd('\0') 

... dovrebbe fare il trucco.

-Oisin

7

Trim predefinita removes only whitespace, dove gli spazi bianchi è definito da char.IsWhitespace.

'\0' è un carattere di controllo, non uno spazio bianco.

È possibile specificare quali caratteri da tagliare utilizzando il Trim(char[]) di sovraccarico:

string result = Encoding.ASCII.GetString(data).Trim(new char[] { '\0' }); 
1

Perché cercare di creare la stringa prima e ritagliarlo secondo? Questo potrebbe aggiungere un sacco di spese generali (se il byte [] è grande).

È possibile specificare index e count nel sovraccarico GetString(byte[] bytes, int index, int count).

int count = data.Count(bt => bt != 0); // find the first null 
string result = Encoding.ASCII.GetString(data, 0, count); // Get only the characters you want 
0

in PowerShell, si può fare questo:

$yourString.TrimEnd(0x00)