【发布时间】:2017-12-31 04:18:52
【问题描述】:
我正在尝试实现 socks5 代理服务器。 根据 rfc,大多数事情都很清楚,但我被困在解释客户端端口并以字节为单位写入端口号。
我做了一个函数,它需要一个 int 并返回 2 个字节。此函数首先将数字转换为二进制,然后将位拆分为字符串,然后将它们转换回字节。但这似乎是错误的,因为如果最右边的位为 0,它们就会丢失。 这是函数
func getBytesOfInt(i int) []byte {
binary := fmt.Sprintf("%b", i)
if i < 255 {
return []byte{byte(i)}
}
first := binary[:8]
last := binary[9:]
fmt.Println(binary, first, last)
i1, _ := strconv.ParseInt(first, 2, 64)
i2, _ := strconv.ParseInt(last, 2, 64)
return []byte{byte(i1), byte(i2)}
}
你能解释一下我应该如何解析数字并获得 2 个字节,最重要的是我如何将它转换回整数。
目前,如果您为此函数提供 1024,它将返回 []byte{0x80, 0x0},即十进制的 128,但正如您所见,正确的位丢失了,只有一个无用的 0。
【问题讨论】:
-
这是许多将整数转换为二进制问题的副本,例如stackoverflow.com/questions/16888357/…。看看 encoding/binary 包,它比一个字符串然后返回要高效得多。
-
@Matthias247 binary.Write 结果对我的情况完全不可用,它给了我比我需要的更多的字节数
-
然后只使用你需要的字节。或者在转换为二进制之前转换为short。
-
github.com/golang/net/tree/master/proxy 中的代码可能对您有用。请参阅协议服务器端的 _test.go 文件。
标签: go binary network-programming binary-data socks