在处理 Golang 中的原始 IP 数据包时,我遇到了一个问题,但似乎找不到解决方案:
IPv4 规范 包含比 8 位还小的字段。例如版本或头部长度(每个占用 4 位)或标志(3 位)。
如何从 io.Reader 中读取这些值,并在之后使用 Golang 处理它们? 我目前一直在使用 binary.Read 方法,但由于 Golang 中最小的整数类型是 int8,因此在这种情况下不可能实现。
在处理 Golang 中的原始 IP 数据包时,我遇到了一个问题,但似乎找不到解决方案:
IPv4 规范 包含比 8 位还小的字段。例如版本或头部长度(每个占用 4 位)或标志(3 位)。
如何从 io.Reader 中读取这些值,并在之后使用 Golang 处理它们? 我目前一直在使用 binary.Read 方法,但由于 Golang 中最小的整数类型是 int8,因此在这种情况下不可能实现。
io.Reader
只能读取字节,而不能读取位。你可以读取字节并自己提取位:
var (
byte0 byte = 0xAF
byte5 byte = 0x89
)
version := byte0 >> 4
headerLength := byte0 & 0x0F
flags := byte5 >> 5
BitReader
类型,这可能会更有效率,但你明白我的意思:http://play.golang.org/p/Wyr_K9YAro :)