为了账号安全,请及时绑定邮箱和手机立即绑定

从字节中删除 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 关注
  • 320 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信