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

时间:2017-12-31 04:18:52

标签: go binary network-programming binary-data socks

我正在尝试实现socks5代理服务器。 根据rfc,大多数事情都很清楚,但是我解释了客户端端口并以字节为单位编写了端口号。

我创建了一个函数,它接受一个int并返回2个字节。这个函数首先将数字转换为二进制,然后逐字地将这些位作为字符串拆分,然后将它们转换回byte.However这似乎是错误的,因为如果最右边的位为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是无用的。

1 个答案:

答案 0 :(得分:1)

您的代码有多个问题。第一个:8和9:错过元素([8]),参见:https://play.golang.org/p/yuhh4ZeJFNL

而且,你应该把第二个字节作为int的低字节和第一个字节作为高字节,而不是字面上切割二进制字符串。例如,4应该作为[0x0,0x4]代替[0x4,0x0],而不是n := len(binary) first := binary[:n-8] last := binary[n-8:]

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

b[0],b[1] = i >> 8, i & 255

然而,这是非常低效的。

我建议i = b[0]<<8 + b[1]library(data.table) library(dplyr) rm(list=ls()) k <- c(LETTERS[1:5]) v <- list('a','b', c('c','d','e'), c('f','g'), 'h') df <- cbind(k, v) %>% as.data.frame(df) df df.temp <- df %>% mutate(vn = sapply(v, length)) k <- rep(df.temp$k, df.temp$vn, each=TRUE) %>% unlist v <- unlist(df.temp$v) df2 <- data.frame(k, v) df1 <- df$k %>% unlist %>% data.frame(k=.) df1 df2