完善gbinary示例

This commit is contained in:
John 2018-01-18 17:40:16 +08:00
parent 4911fd58eb
commit a16314aa78
3 changed files with 28 additions and 14 deletions

View File

@ -14,7 +14,7 @@ import (
)
// 二进制位(0|1)
type Bit uint8
type Bit int8
// 针对基本类型进行二进制打包,支持的基本数据类型包括:int/8/16/32/64、uint/8/16/32/64、float32/64、bool、string、[]byte
func Encode(vs ...interface{}) ([]byte, error) {
@ -237,8 +237,13 @@ func DecodeToFloat64(b []byte) float64 {
return math.Float64frombits(binary.LittleEndian.Uint64(fillUpSize(b, 8)))
}
// 默认编码
func EncodeBits(bits []Bit, i int, l int) []Bit {
return EncodeBitsWithUint(bits, uint(i), l)
}
// 将ui按位合并到bits数组中并占length长度位(注意uis数组中存放的是二进制的0|1数字)
func EncodeBits(bits []Bit, ui uint, l int) []Bit {
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)
@ -250,7 +255,6 @@ func EncodeBits(bits []Bit, ui uint, l int) []Bit {
return a
}
}
// 将bits转换为[]byte从左至右进行编码不足1 byte按0往末尾补充
func EncodeBitsToBytes(bits []Bit) []byte {
if len(bits)%8 != 0 {
@ -260,25 +264,34 @@ func EncodeBitsToBytes(bits []Bit) []byte {
}
b := make([]byte, 0)
for i := 0; i < len(bits); i += 8 {
b = append(b, byte(DecodeBits(bits[i : i + 8])))
b = append(b, byte(DecodeBitsToUint(bits[i : i + 8])))
}
return b
}
// 从ui字位数组中解析为uint
func DecodeBits(bits []Bit) uint {
ui := uint(0)
// 解析为int
func DecodeBitsToInt(bits []Bit) int {
v := int(0)
for _, i := range bits {
ui = ui << 1 | uint(i)
v = v << 1 | int(i)
}
return ui
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 = EncodeBits(bits, uint(b), 8)
bits = EncodeBitsWithUint(bits, uint(b), 8)
}
return bits
}

View File

@ -10,7 +10,7 @@ func main() {
count := 100
status := 1
// 编码
// 网关编码
bits := make([]gbinary.Bit, 0)
for i := 0; i < count; i++ {
bits = gbinary.EncodeBits(bits, uint(status), 2)
@ -18,7 +18,9 @@ func main() {
buffer := gbinary.EncodeBitsToBytes(bits)
fmt.Println("buffer length:", len(buffer))
// 解码
/* 上报过程忽略,这里只展示编码/解码示例 */
// 平台解码
alivecount := 0
sensorbits := gbinary.DecodeBytesToBits(buffer)
for i := 0; i < len(sensorbits); i += 2 {

View File

@ -2,9 +2,8 @@ package main
import (
"fmt"
"runtime"
)
func main() {
fmt.Println(runtime.GOMAXPROCS(0))
fmt.Printf("%b\n", 123)
}