亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從字節中刪除 NUL 字符

從字節中刪除 NUL 字符

Go
DIEA 2021-06-04 14:34:04
為了自學 Go,我正在構建一個簡單的服務器,它接受一些輸入,進行一些處理,并將輸出發送回客戶端(包括原始輸入)。輸入的長度可以從大約 5 - 13 個字符 + 結束行以及客戶端發送的任何其他內容不等。輸入被讀入一個字節數組,然后轉換為字符串進行一些處理。另一個字符串被附加到這個字符串,整個內容被轉換回一個字節數組以發送回客戶端。問題是輸入填充了一堆 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()此外,如果我在這里做任何其他明顯愚蠢的事情,我會很高興知道。
查看完整描述

3 回答

?
Qyouu

TA貢獻1786條經驗 獲得超11個贊

你的方法聽起來基本正確。一些備注:

  1. 當您在 中找到第一個 nul 字節的索引時data,您不需要復制,只需截斷切片:data[:idx]。

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

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


查看完整回答
反對 回復 2021-06-07
?
翻翻過去那場雪

TA貢獻2065條經驗 獲得超14個贊

該io.Reader文檔說:


Read 將最多 len(p) 個字節讀入 p。它返回讀取的字節數 (0 <= n <= len(p)) 和遇到的任何錯誤。


如果應用程序中對 Read 的調用未讀取 16 個字節,data則將有尾隨零字節。使用讀取的字節數從緩沖區中修剪零字節。


data := make([]byte, 16)

n, err := c.Read(data)

if err != nil {

   // handle error

}

data = data[:n]

還有一個問題。無法保證 Read 會吸收對等方發送的所有“消息”。應用程序可能需要多次調用 Read 來獲取完整的消息。


您在問題中提到了結尾。如果來自客戶端的消息終止但換行,則使用bufio.Scanner從連接中讀取行:


 s := bufio.NewScanner(c)

 if s.Scan() {

     data = s.Bytes() // data is next line, not including end lines, etc.

 }

 if s.Err() != nil {

     // handle error

 } 


查看完整回答
反對 回復 2021-06-07
  • 3 回答
  • 0 關注
  • 362 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號