2013-03-15 14 views
12

Per insegnare a me stesso Go Sto costruendo un server semplice che accetta un input, esegue un po 'di elaborazione e invia l'output al client (che include l'input originale).Rimozione dei caratteri NULL dai byte

L'input può variare in lunghezza da circa 5 - 13 caratteri + linee di fine e in qualsiasi altra guff il client invia.

L'input viene letto in una matrice di byte e quindi convertito in una stringa per l'elaborazione. Un'altra stringa viene aggiunta a questa stringa e il tutto viene riconvertito in una matrice di byte per essere rispedito al client.

Il problema è che l'input è riempito con un gruppo di caratteri NUL e non sono sicuro di come eliminarli.

Così ho potuto scorrere l'array e quando arrivo a un carattere nul, nota la lunghezza (n), crea un nuovo array di byte di quella lunghezza e copia i primi n caratteri sul nuovo array di byte e usa quella. È il modo migliore, o c'è qualcosa per renderlo più facile per me?

Alcuni Codice ridotta:

data := make([]byte, 16) 
c.Read(data) 

s := strings.Replace(string(data[:]), "an", "", -1) 
s = strings.Replace(s, "\r", "", -1) 
s += "some other string" 
response := []byte(s) 
c.Write(response) 
c.close() 

Anche se sto facendo qualsiasi altra cosa, ovviamente, stupido qui sarebbe bello sapere.

risposta

26

Nel pacchetto "byte", func Trim(s []byte, cutset string) []byte è tuo amico:

Trim restituisce un subslice di s tagliando fuori tutti i punti di codice iniziali e finali UTF-8-encoded Unicode contenute nel dell'insieme di taglio.

// Remove any NULL characters from 'b' 
b = bytes.Trim(b, "\x00") 
+0

Grazie. Penso di averlo provato ma non sembra funzionare con \ 0, che suppongo fosse il mio problema. –

+2

@Knyght: sì, perché, '\ 0' è una sequenza di escape illegale (controlla le [specifiche] (http://golang.org/ref/spec#octal_byte_value)). si deve usare '\ 000': http://play.golang.org/p/KP8WLyfUB- – zzzz

+0

@zzzz - ho un Dim Buffer() As Byte. quindi per questo Buffer = byte.Trim (Buffer, "\ x00") byte mostra errore in VB.net – picnic4u

1

L'approccio sembra fondamentalmente corretto. Alcune osservazioni:

  1. Quando avete trovato l'indice del primo byte nul in data, non c'è bisogno di copiare, basta troncare la fetta: data[:idx].

  2. bytes.Index dovrebbe essere in grado di trovare quell'indice per voi.

  3. C'è anche bytes.Replace quindi non è necessario convertire in stringa.

+0

ho avuto problemi con i caratteri di controllo con bytes.Replace a meno che non sto facendo qualcosa di sbagliato c'è. –

Problemi correlati