[] byte to [] int或[] bool

mgm*_*mgm 7 type-conversion bit go slice

假设我有一个[]byte并且为了让我的生活更轻松,我想以一种[]int[]bool以下的方式转换它:

让我们说我开始[]byte{0x41},就是这样0b01000001.现在,我想获得的是:

[]int{0,1,0,0,0,0,0,1}
Run Code Online (Sandbox Code Playgroud)

要么

[]bool{f,t,f,f,f,f,f,t}
Run Code Online (Sandbox Code Playgroud)

我想我可以用这样的东西循环:

mybyte & (1 << pos)
Run Code Online (Sandbox Code Playgroud)

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

icz*_*cza 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
}
Run Code Online (Sandbox Code Playgroud)

您解释了要转换[]byte为,[]bool因为您将输入视为一组单独的位.

在这种情况下,只需使用big.Int.它具有Int.Bit()Int.SetBit()方法来获取和在给定位置设置了一下.要使用big.Intraw "初始化" 值[]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())
Run Code Online (Sandbox Code Playgroud)

输出(在Go Playground上试试):

intput bytes: [65 1]
data: 100000100000001
7. bit before: 0
7. bit after: 1
data: 100000110000001
output bytes: [65 129]
Run Code Online (Sandbox Code Playgroud)