2013-03-15 96 views
12

教我自己Go我正在構建一個簡單的服務器,它需要一些輸入,做一些處理並將輸出發送回客戶端(包括原始輸入)。從字節中刪除NUL字符

輸入的長度可以從5-13個字符+ endlines以及客戶端發送的任何其他guff變化。

將輸入讀入字節數組,然後轉換爲字符串進行一些處理。另一個字符串被追加到這個字符串中,整個事物被轉換回一個字節數組,並被髮送回客戶端。

問題是輸入是用一堆NUL字符填充的,我不知道如何擺脫它們。

所以我可以循環訪問數組,並且當我來到一個nul字符時,請注意長度(n),創建一個新長度的字節數組,並將前n個字符複製到新的字節數組中並使用那。這是最好的方式,還是有什麼讓我更容易?

一些精簡代碼:

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

而且,如果我做任何事情都要明顯的愚蠢這將是很好的瞭解。

回答

26

在包「字節」,func Trim(s []byte, cutset string) []byte是你的朋友:

修剪返回由割掉包含在割集所有的開頭和結尾的UTF-8編碼的Unicode代碼點S的子切片。

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

謝謝。我想我已經嘗試過了,但似乎並不適用於\ 0,我認爲這是我的問題。 – 2013-03-15 13:54:48

+2

@Knyght:是的,因爲'\ 0'是非法的轉義序列(檢查[specs](http://golang.org/ref/spec#octal_byte_value))。一個必須使用'\ 000':http://play.golang.org/p/KP8WLyfUB- – zzzz 2013-03-15 14:05:15

+0

@zzzz - 我有一個Dim Buffer()As Byte。因此對於此 緩衝區= bytes.Trim(緩衝區,「\ x00」) 字節在VB.net中顯示錯誤 – picnic4u 2015-01-03 15:34:44

1

你的方法聽起來基本正確。一些言論:

  1. 當你已經找到了第一個NULL字節的指數data,你並不需要複製,只是截斷片:data[:idx]

  2. bytes.Index應該能夠爲您找到該索引。

  3. 還有bytes.Replace所以你不需要轉換爲字符串。

+0

我不得不使用控制字符bytes.Replace除非我做錯事有問題。 – 2013-03-15 12:07:43