...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
按位操作处理示例
gbinary
的Bits
相关操作简化了底层二进制位操作的复杂度,为精准的数据按位处理提供了可能。
...
批量传感器状态数据上报示例
例如,针对于物联网项目而言,传感器设备是比较常见的硬件设备,我们以下的示例展示了网关向平台上报其下管理的传感器的状态信息。由于传感器状态只有4种(0:已下线,1:开启, 2:关闭, 3:待机
),正好对应了2个二进制位(2 bit),因此1byte(8 bit)
便可以表示出4个传感器设备的状态。
看以下的例子,用以上报平台100个传感器已开启,上报的状态顺序便是传感器在网关下端口顺序(索引从0开始):
https://github.com/gogf/gf/blob/master/.example/encoding/gbinary/bits1.go
package main
import (
"fmt"
"github.com/gogf/gf/encoding/gbinary"
)
func main() {
// 传感器状态,0:已下线, 1:开启, 2:关闭, 3:待机
count := 100
status := 1
// 网关编码
bits := make([]gbinary.Bit, 0)
for i := 0; i < count; i++ {
bits = gbinary.EncodeBits(bits, uint(status), 2)
}
buffer := gbinary.EncodeBitsToBytes(bits)
fmt.Println("buffer length:", len(buffer))
/* 上报过程忽略,这里只展示编码/解码示例 */
// 平台解码
alivecount := 0
sensorbits := gbinary.DecodeBytesToBits(buffer)
for i := 0; i < len(sensorbits); i += 2 {
if gbinary.DecodeBits(sensorbits[i:i+2]) == 1 {
alivecount++
}
}
fmt.Println("alived sensor:", alivecount)
}
执行后输出结果为:
buffer length: 25
alived sensor: 100
可以看到,上报100个传感器的状态数据只需要25byte即可,该示例中我们在平台上解码后统计开启的传感器数量有100台。
gkvdb数据库META数据结构操作示例
我们再看看一个实战的例子。gkvdb
是gf
框架相同作者开发的基于DRH算法的高性能Key-Value嵌入式数据库
,其中元数据的存储数据结构如下:
[键名哈希64(64bit,8byte) 键名长度(8bit,1byte) 键值长度(24bit,3byte) 数据文件偏移量(40bit,5byte)](变长)
我们使用一条元数据来演示编码/解码操作。
github.com/gogf/gf/blob/master/.example/encoding/gbinary/bits2.go
package main
import (
"fmt"
"github.com/gogf/gf/encoding/gbinary"
)
func main() {
// Meta元数据文件数据结构:[键名哈希64(64bit,8byte) 键名长度(8bit,1byte) 键值长度(24bit,3byte) 数据文件偏移量(40bit,5byte)](变长)
hash := 521369841259754125
klen := 12
vlen := 35535
offset := 80000000
// 编码
bits := make([]gbinary.Bit, 0)
bits = gbinary.EncodeBits(bits, hash, 64)
bits = gbinary.EncodeBits(bits, klen, 8)
bits = gbinary.EncodeBits(bits, vlen, 24)
bits = gbinary.EncodeBits(bits, offset, 40)
buffer := gbinary.EncodeBitsToBytes(bits)
fmt.Println("meta length:", len(buffer))
/* 文件存储及数据查询过程忽略,这里只展示元数据编码/解码示例 */
// 解码
metabits := gbinary.DecodeBytesToBits(buffer)
fmt.Println("hash :", gbinary.DecodeBits(metabits[0 : 64]))
fmt.Println("klen :", gbinary.DecodeBits(metabits[64 : 72]))
fmt.Println("vlen :", gbinary.DecodeBits(metabits[72 : 96]))
fmt.Println("offset:", gbinary.DecodeBits(metabits[96 : 136]))
}
运行后,输出结果为:
...