Go 如何将端口号以2字节的形式返回到socks5代理中的客户端?

Go 如何将端口号以2字节的形式返回到socks5代理中的客户端?,go,binary,network-programming,binary-data,socks,Go,Binary,Network Programming,Binary Data,Socks,我正在尝试实现socks5代理服务器。 根据rfc,大多数事情都很清楚,但我一直在解释客户端端口并以字节为单位写入端口号 我做了一个函数,它可以得到一个int并返回2个字节。此函数首先将数字转换为二进制,然后将位拆分为字符串,然后将其转换回字节。然而,这似乎是错误的,因为如果最右边的位为0,则它们将丢失。 下面是函数 func getBytesOfInt(i int) []byte { binary := fmt.Sprintf("%b", i) if i < 255 {

我正在尝试实现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)}
}
func getBytesOfInt(i int)[]字节{
二进制:=fmt.Sprintf(“%b”,i)
如果我<255{
返回[]字节{字节(i)}
}
第一个:=二进制[:8]
last:=二进制[9:]
fmt.Println(二进制、第一个、最后一个)
i1,:=strconv.ParseInt(第一,2,64)
i2,:=strconv.ParseInt(last,2,64)
返回[]字节{字节(i1),字节(i2)}
}
你能解释一下我应该如何解析这个数字并得到2个字节,最重要的是我应该如何将它转换回整数


当前,如果您将1024赋给此函数,它将返回
[]字节{0x80,0x0}
,它是128位小数,但正如您看到的,正确的位丢失了,只有一个0是无用的。

您的代码有多个问题。第一:8和9:缺少元素([8]),请参见:

而且,您应该将第二个字节作为int的lowbyte,将第一个字节作为highbyte,而不是直接剪切二进制字符串。例如,
4
应作为
[0x0,0x4]
而不是应该为1024的
[0x4,0x0]
进行插入

如果您想继续使用strconv,您应该使用:

n := len(binary)
first := binary[:n-8]
last := binary[n-8:]
然而,这是非常不够的


我建议
b[0]、b[1]=I>>8、I&255
I=b[0]您能解释一下所有按位运算的情况吗?是否有任何资源可以让我了解这些运算的更多信息?我仍然很难理解为什么以及如何使用按位运算。所有的资源都解释了它们所做的事情,我完全理解,但没有一个提到为什么我们需要在二进制上进行这些操作。在你的例子中,我理解第二部分,它将b[0]8位向左移动,并添加b[1],这很有意义,但第一部分我完全丢失了@leadbebobpy你指的是低字节和高字节,而不是“位”。255基本上是11111111,这是低字节的掩码。这是一个相当简单的位运算。要理解为什么需要位运算,您可能需要了解机器是如何工作的,什么是字节以及INT是如何存储的。但是,我没有用英语学习所有这些,所以我不能推荐资源。可能重复的是这里的许多将整数转换为二进制的问题,例如。看看编码/二进制软件包,它的效率远远高于字符串来回转换。@Matthias247 binary.Write results一些在我的情况下完全不可用的东西它给了我比我需要的更多的字节,然后只使用你需要的字节。或者在转换为二进制之前先转换为短代码。中的代码可能对您有用。有关协议的服务器端,请参阅_test.go文件。