2013-03-15 53 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