【问题标题】:Golang: Parse bit values from a byteGolang:从一个字节中解析位值
【发布时间】:2019-07-15 11:53:23
【问题描述】:

我需要解析一个由两个字节组成的网络数据包:第一个由 8 位组成,根据它们的顺序设置某些标志(例如),第二个是 uint8(这很简单)

  • 1 - 在线
  • 0 - 未激活
  • 1 - 漂亮
  • 1 - isHandsome
  • 0 - 秃头
  • 0 - 聋人
  • 0 - 静音
  • 0 - 盲人

如何从字节原语中解析它?

【问题讨论】:

标签: go


【解决方案1】:

一些有用的用于处理二进制的 Go 标准库包:

要从字节中提取单个位,您应该使用按位运算符 - |&>>

For example:

package main

import (
    "fmt"
)

func main() {
    v := byte(0xB2)
    if (v >> 4) & 1 == 1 {
        fmt.Println("bit 4 (counting from 0) is set")
    }
}

这通过将字节值向右移动 4 个位置并将AND-ing 与 1 一起检查位 4(位 0 是字节中的最低位)。您可以类似地检查标志值中的其他位。随意编写一个函数,将上面示例中的 4 替换为参数 N 以检查位号 N

您可以在其他 SO 答案中找到更多示例,例如 this one 或评论中链接到的 @icza。

【讨论】:

  • 在这个例子中可能无关紧要,但v & (1<<4) != 0 会更高效一些,因为转换可以在编译时完成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-09
  • 2022-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-21
  • 1970-01-01
相关资源
最近更新 更多