mirror of
https://gitee.com/johng/gf.git
synced 2024-12-02 20:28:17 +08:00
完善gbinary示例
This commit is contained in:
parent
4911fd58eb
commit
a16314aa78
@ -14,7 +14,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// 二进制位(0|1)
|
// 二进制位(0|1)
|
||||||
type Bit uint8
|
type Bit int8
|
||||||
|
|
||||||
// 针对基本类型进行二进制打包,支持的基本数据类型包括:int/8/16/32/64、uint/8/16/32/64、float32/64、bool、string、[]byte
|
// 针对基本类型进行二进制打包,支持的基本数据类型包括:int/8/16/32/64、uint/8/16/32/64、float32/64、bool、string、[]byte
|
||||||
func Encode(vs ...interface{}) ([]byte, error) {
|
func Encode(vs ...interface{}) ([]byte, error) {
|
||||||
@ -237,8 +237,13 @@ func DecodeToFloat64(b []byte) float64 {
|
|||||||
return math.Float64frombits(binary.LittleEndian.Uint64(fillUpSize(b, 8)))
|
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数字)
|
// 将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)
|
a := make([]Bit, l)
|
||||||
for i := l - 1; i >= 0; i-- {
|
for i := l - 1; i >= 0; i-- {
|
||||||
a[i] = Bit(ui & 1)
|
a[i] = Bit(ui & 1)
|
||||||
@ -250,7 +255,6 @@ func EncodeBits(bits []Bit, ui uint, l int) []Bit {
|
|||||||
return a
|
return a
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 将bits转换为[]byte,从左至右进行编码,不足1 byte按0往末尾补充
|
// 将bits转换为[]byte,从左至右进行编码,不足1 byte按0往末尾补充
|
||||||
func EncodeBitsToBytes(bits []Bit) []byte {
|
func EncodeBitsToBytes(bits []Bit) []byte {
|
||||||
if len(bits)%8 != 0 {
|
if len(bits)%8 != 0 {
|
||||||
@ -260,25 +264,34 @@ func EncodeBitsToBytes(bits []Bit) []byte {
|
|||||||
}
|
}
|
||||||
b := make([]byte, 0)
|
b := make([]byte, 0)
|
||||||
for i := 0; i < len(bits); i += 8 {
|
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
|
return b
|
||||||
}
|
}
|
||||||
|
|
||||||
// 从ui字位数组中解析为uint
|
// 解析为int
|
||||||
func DecodeBits(bits []Bit) uint {
|
func DecodeBitsToInt(bits []Bit) int {
|
||||||
ui := uint(0)
|
v := int(0)
|
||||||
for _, i := range bits {
|
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
|
// 解析[]byte为字位数组[]uint8
|
||||||
func DecodeBytesToBits(bs []byte) []Bit {
|
func DecodeBytesToBits(bs []byte) []Bit {
|
||||||
bits := make([]Bit, 0)
|
bits := make([]Bit, 0)
|
||||||
for _, b := range bs {
|
for _, b := range bs {
|
||||||
bits = EncodeBits(bits, uint(b), 8)
|
bits = EncodeBitsWithUint(bits, uint(b), 8)
|
||||||
}
|
}
|
||||||
return bits
|
return bits
|
||||||
}
|
}
|
@ -10,7 +10,7 @@ func main() {
|
|||||||
count := 100
|
count := 100
|
||||||
status := 1
|
status := 1
|
||||||
|
|
||||||
// 编码
|
// 网关编码
|
||||||
bits := make([]gbinary.Bit, 0)
|
bits := make([]gbinary.Bit, 0)
|
||||||
for i := 0; i < count; i++ {
|
for i := 0; i < count; i++ {
|
||||||
bits = gbinary.EncodeBits(bits, uint(status), 2)
|
bits = gbinary.EncodeBits(bits, uint(status), 2)
|
||||||
@ -18,7 +18,9 @@ func main() {
|
|||||||
buffer := gbinary.EncodeBitsToBytes(bits)
|
buffer := gbinary.EncodeBitsToBytes(bits)
|
||||||
fmt.Println("buffer length:", len(buffer))
|
fmt.Println("buffer length:", len(buffer))
|
||||||
|
|
||||||
// 解码
|
/* 上报过程忽略,这里只展示编码/解码示例 */
|
||||||
|
|
||||||
|
// 平台解码
|
||||||
alivecount := 0
|
alivecount := 0
|
||||||
sensorbits := gbinary.DecodeBytesToBits(buffer)
|
sensorbits := gbinary.DecodeBytesToBits(buffer)
|
||||||
for i := 0; i < len(sensorbits); i += 2 {
|
for i := 0; i < len(sensorbits); i += 2 {
|
||||||
|
@ -2,9 +2,8 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"runtime"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
fmt.Println(runtime.GOMAXPROCS(0))
|
fmt.Printf("%b\n", 123)
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user