Domanda

Ho un array di byte che ricevo da un'entità esterna. Si tratta di una dimensione fissa. I byte contengono una stringa unicode, con valori 0 per riempire il resto del buffer:

Così il byte potrebbe essere:

H \0 E \0 L \0 L \0 \0 \0 \0 \0 \0 ... etc 

mi sto che buffer e convertirlo in una stringa in questo modo:

byte[] buffer = new byte[buffSize];
m_dataStream.Read(buffer, 0, buffSize);
String cmd = System.Text.Encoding.Unicode.GetString(buffer);

Quello che torno è una stringa che assomiglia a questo:

"HELLO\0\0\0\0\0\0\0\0..."

Come faccio a sapere GetString per terminare la stringa al primo nullo Unicode (vale a dire quindi ho solo tornare "CIAO")?

Grazie per ogni ingresso.

È stato utile?

Soluzione

Se sei sicuro il resto è tutto \ 0, questo dovrebbe funzionare:

cmd = cmd.TrimEnd('\0');

In caso contrario, se si desidera solo per ottenere tutto ciò che prima del primo nullo:

int index = cmd.IndexOf('\0');
if (index >= 0)
   cmd = cmd.Remove(index);

Si noti che Unicode.GetString si prenderà cura di doppi 0s \. Si dovrebbe solo cercare un singolo \ 0.

Altri suggerimenti

Il modo più semplice sarebbe quella di tagliare la corda dopo la conversione, come già suggerito.

Se si conosce il conteggio dei caratteri in anticipo, è possibile utilizzare l'overload GetString che prende un indice di inizio e un conteggio di byte, al fine di ottenere la stringa corretta, senza taglio.

Se non si conosce il conteggio dei caratteri in anticipo, e vorrei evitare di tagliare la corda in seguito, è necessario tagliare l'array di byte prima, quindi si passa solo il byte che ti interessa. Per Unicode, questo significherebbe rimozione di qualsiasi byte dopo compresa la prima coppia di zeri.

Invece di rielaborare la stringa è possibile ottenere la prima occorrenza del byte null nel buffer (utilizzando System.Array.IndexOf). È quindi possibile utilizzare il metodo di overload System.Text.Encoding.Unicode.GetString per creare una stringa fino alla data dimensione del buffer.

Il seguente esempio anche adatto per un tampone contenente alcun byte nulli:

byte[] buffer = new byte[buffSize];
m_dataStream.Read(buffer, 0, buffSize);
var size = System.Array.IndexOf(buffer, (byte)0);
String cmd = System.Text.Encoding.Unicode.GetString(buffer, 0, size < 0 ? buffSize : size);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top