mirror of
https://gitee.com/johng/gf.git
synced 2024-12-05 05:37:55 +08:00
73 lines
1.6 KiB
Go
73 lines
1.6 KiB
Go
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
||
//
|
||
// This Source Code Form is subject to the terms of the MIT License.
|
||
// If a copy of the MIT was not distributed with this file,
|
||
// You can obtain one at https://github.com/gogf/gf.
|
||
|
||
package gbinary
|
||
|
||
// NOTE: THIS IS AN EXPERIMENTAL FEATURE!
|
||
|
||
// 二进制位(0|1)
|
||
type Bit int8
|
||
|
||
// 默认编码
|
||
func EncodeBits(bits []Bit, i int, l int) []Bit {
|
||
return EncodeBitsWithUint(bits, uint(i), l)
|
||
}
|
||
|
||
// 将ui按位合并到bits数组中,并占length长度位(注意:uis数组中存放的是二进制的0|1数字)
|
||
func EncodeBitsWithUint(bits []Bit, ui uint, l int) []Bit {
|
||
a := make([]Bit, l)
|
||
for i := l - 1; i >= 0; i-- {
|
||
a[i] = Bit(ui & 1)
|
||
ui >>= 1
|
||
}
|
||
if bits != nil {
|
||
return append(bits, a...)
|
||
} else {
|
||
return a
|
||
}
|
||
}
|
||
|
||
// 将bits转换为[]byte,从左至右进行编码,不足1 byte按0往末尾补充
|
||
func EncodeBitsToBytes(bits []Bit) []byte {
|
||
if len(bits)%8 != 0 {
|
||
for i := 0; i < len(bits)%8; i++ {
|
||
bits = append(bits, 0)
|
||
}
|
||
}
|
||
b := make([]byte, 0)
|
||
for i := 0; i < len(bits); i += 8 {
|
||
b = append(b, byte(DecodeBitsToUint(bits[i:i+8])))
|
||
}
|
||
return b
|
||
}
|
||
|
||
// 解析为int
|
||
func DecodeBits(bits []Bit) int {
|
||
v := 0
|
||
for _, i := range bits {
|
||
v = v<<1 | int(i)
|
||
}
|
||
return v
|
||
}
|
||
|
||
// 解析为uint
|
||
func DecodeBitsToUint(bits []Bit) uint {
|
||
v := uint(0)
|
||
for _, i := range bits {
|
||
v = v<<1 | uint(i)
|
||
}
|
||
return v
|
||
}
|
||
|
||
// 解析[]byte为字位数组[]uint8
|
||
func DecodeBytesToBits(bs []byte) []Bit {
|
||
bits := make([]Bit, 0)
|
||
for _, b := range bs {
|
||
bits = EncodeBitsWithUint(bits, uint(b), 8)
|
||
}
|
||
return bits
|
||
}
|