我正在尝试实现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是无用的。
答案 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
。