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)
但我一直在寻找一种更紧凑的方法.
标准库中没有就绪函数可以做到这一点.这是使用循环的可能解决方案:
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.Int
raw "初始化" 值[]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)