1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- // 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!
- // Bit Binary bit (0 | 1)
- type Bit int8
- // EncodeBits does encode bits return bits Default coding
- func EncodeBits(bits []Bit, i int, l int) []Bit {
- return EncodeBitsWithUint(bits, uint(i), l)
- }
- // EncodeBitsWithUint . Merge ui bitwise into the bits array and occupy the length bits
- // (Note: binary 0 | 1 digits are stored in the uis array)
- 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...)
- }
- return a
- }
- // EncodeBitsToBytes . does encode bits to bytes
- // Convert bits to [] byte, encode from left to right, and add less than 1 byte from 0 to the end.
- 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
- }
- // DecodeBits .does decode bits to int
- // Resolve to int
- func DecodeBits(bits []Bit) int {
- v := 0
- for _, i := range bits {
- v = v<<1 | int(i)
- }
- return v
- }
- // DecodeBitsToUint .Resolve to uint
- func DecodeBitsToUint(bits []Bit) uint {
- v := uint(0)
- for _, i := range bits {
- v = v<<1 | uint(i)
- }
- return v
- }
- // DecodeBytesToBits .Parsing [] byte into character array [] uint8
- func DecodeBytesToBits(bs []byte) []Bit {
- bits := make([]Bit, 0)
- for _, b := range bs {
- bits = EncodeBitsWithUint(bits, uint(b), 8)
- }
- return bits
- }
|