2013-03-15 21 views
12

Nauczyć się Go Buduję prosty serwer, który pobiera dane wejściowe, przetwarza i wysyła dane wyjściowe do klienta (który zawiera oryginalne dane wejściowe).Usuwanie znaków NUL z bajtów

Dane wejściowe mogą mieć długość od około 5 do 13 znaków + linie końcowe i inne komunikaty wysyłane przez klienta.

Dane wejściowe są odczytywane do tablicy bajtów, a następnie przekształcane na ciąg znaków w celu przetworzenia. Do tego ciągu dołączany jest inny ciąg znaków, a cała rzecz jest przekształcana z powrotem w tablicę bajtów, aby odesłać ją do klienta.

Problem polega na tym, że dane wejściowe zawierają wiele znaków NUL i nie jestem pewien, jak się ich pozbyć.

Mogę więc przechodzić przez tablicę i kiedy dojdę do znaku nul, zanotuj długość (n), utwórz nową tablicę bajtów o tej długości i skopiuj pierwsze n znaków do nowej tablicy bajtów i użyj że. Czy to najlepszy sposób, czy jest coś, co ułatwi mi to?

Niektóre okrojona Kod:

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() 

Także jeśli robię coś innego oczywiście głupi tutaj byłoby miło wiedzieć.

Odpowiedz

26

W pakiecie "bajty", func Trim(s []byte, cutset string) []byte jest twoim przyjacielem:

trymowania zwraca subslice S przez cięcie wyłączyć wszystkie początkowe i końcowe UTF-8 zakodowany Unicode punktów kodowych zawartych w cutset.

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

Dzięki. Myślę, że próbowałem tego, ale nie działało z \ 0, co moim zdaniem było moim problemem. –

+2

@Knata: tak, ponieważ '\ 0' jest nielegalną sekwencją ucieczki (sprawdź [specyfikację] (http://golang.org/ref/spec#octal_byte_value)). trzeba użyć '\ 000': http://play.golang.org/p/KP8WLyfUB- – zzzz

+0

@zzzz - mam Dim Buffer() jako Byte. więc dla tego Bufor = bajty.Trim (Bufor, "\ x00") bajtów pokazuje błąd w VB.net – picnic4u

1

Twoje podejście brzmi właściwie. Kilka uwag:

  1. Po znalezieniu indeks pierwszy bajt nul w data, nie trzeba skopiować, po prostu obciąć kawałek: data[:idx].

  2. powinien być w stanie znaleźć ten indeks dla ciebie.

  3. Istnieje również bytes.Replace, więc nie trzeba konwertować na ciąg.

+0

miałem problemy z używaniem znaków sterujących z bytes.Replace chyba że robię coś złego tam. –

Powiązane problemy