【问题标题】:[]byte to []int or []bool[]byte 到 []int 或 []bool
【发布时间】:2018-08-06 22:49:07
【问题描述】:

假设我有一个[]byte,为了让我的生活更轻松,我想通过以下方式将其转换为[]int[]bool

假设我以[]byte{0x41} 开头,即0b01000001。现在,我想获得的是这样的:

[]int{0,1,0,0,0,0,0,1}

[]bool{f,t,f,f,f,f,f,t}

我想我可以这样循环:

mybyte & (1 << pos)

但我一直在寻找更紧凑的方法。

【问题讨论】:

  • 那么问题是什么?如果您正在寻找一些神奇的功能或语法糖:停止寻找,没有。编写循环和班次。如果您正在寻找为您执行此操作的软件包:停止查看 SO。
  • 多么好的评论......因为我对这门语言相当陌生,而且我知道strconv.FormatInt( a []byte turned into int , 2) 会返回一个带有二进制表示的字符串作为字符串,我只是在寻找类似的,更紧凑的方法。谢谢你,@Volker,保重。
  • []byte 转换为[]bool 的目的是什么?您希望能够测试单个位吗?
  • []byte 是一组线圈(即:单个位)的 modbus 读取的输出。通过将它们表示为 []int 或 []bool,我可以更好地“解释”我对这些位所做的事情,而不是一直在做轮班。从某种意义上说:对于最终用户和开发人员来说,它更清晰。

标签: go type-conversion slice bit


【解决方案1】:

标准库中没有现成的函数可以做到这一点。这是使用循环的可能解决方案:

func convert(data []byte) []bool {
    res := make([]bool, len(data)*8)
    for i := range res {
        res[i] = data[i/8]&(0x80>>byte(i&0x7)) != 0
    }
    return res
}

您解释说您想将[]byte 转换为[]bool,因为您将输入视为一组单独的位。

在这种情况下,只需使用big.Int。它具有Int.Bit()Int.SetBit() 方法来获取和设置给定位置的位。要使用原始[]byte“初始化”big.Int 值,请使用Int.SetBytes()。如果您修改/操作big.Int,您可以使用Int.Bytes() 取回原始字节。

看这个例子:

data := []byte{0x41, 0x01}
fmt.Println("intput bytes:", data)

bi := big.NewInt(0)
bi.SetBytes(data)
fmt.Println("data:", bi.Text(2))

fmt.Println("7. bit before:", bi.Bit(7))
bi.SetBit(bi, 7, 1)
fmt.Println("7. bit after:", bi.Bit(7))
fmt.Println("data:", bi.Text(2))
fmt.Println("output bytes:", bi.Bytes())

输出(在Go Playground 上试试):

intput bytes: [65 1]
data: 100000100000001
7. bit before: 0
7. bit after: 1
data: 100000110000001
output bytes: [65 129]

【讨论】:

    猜你喜欢
    • 2023-03-21
    • 2013-11-19
    • 1970-01-01
    • 2020-03-15
    • 1970-01-01
    • 2011-07-19
    • 2010-10-30
    相关资源
    最近更新 更多