作者热门文章
- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我正在尝试实现 socks5 代理服务器。根据 rfc,大多数事情都很清楚,但我仍然无法解释客户端端口并以字节为单位写入我的端口号。
我创建了一个函数,它 tkes 一个 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,这是无用的.
最佳答案
您的代码有多个问题。首先:8 和 9:缺少一个元素 ([8]),请参阅:https://play.golang.org/p/yuhh4ZeJFNL
此外,您应该将第二个字节截取为 int 的低字节,将第一个字节截取为高字节,而不是按字面意思切割二进制字符串。例如 4
应该被解释为 [0x0,0x4]
而不是 [0x4,0x0]
应该是 1024。
如果你想继续使用 strconv 你应该使用:
n := len(binary)
first := binary[:n-8]
last := binary[n-8:]
但是效率很低。
我会建议 b[0],b[1] = i >> 8, i & 255
, 和 i = b[0]<<8 + b[1]
.
关于go - 如何在 socks5 代理中将 2 个字节的端口号返回给客户端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48039951/
我是一名优秀的程序员,十分优秀!