假设我有一个[]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)
但我正在寻找一种更紧凑的方法。
答案 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]