使用Golang从读取器中读取小于8位的数据

11

在处理 Golang 中的原始 IP 数据包时,我遇到了一个问题,但似乎找不到解决方案:

IPv4 规范 包含比 8 位还小的字段。例如版本或头部长度(每个占用 4 位)或标志(3 位)。

如何从 io.Reader 中读取这些值,并在之后使用 Golang 处理它们? 我目前一直在使用 binary.Read 方法,但由于 Golang 中最小的整数类型是 int8,因此在这种情况下不可能实现。


1
你可以一次读取一个字节,然后使用位掩码来提取特定的字段。 - Benjamin Gruenbaum
1个回答

15

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 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接