[] byte to [] int或[] bool

时间:2018-02-27 10:13:27

标签: go type-conversion slice bit

假设我有一个[]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)

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

1 个答案:

答案 0 :(得分:7)

标准库中没有就绪功能可以做到这一点。这是一个使用循环的可能解决方案:

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()方法来获取和设置给定位置的位。要使用原始big.Int“初始化”[]byte值,请使用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]