在接入第三方数据流或接入物联网设备时,通常这些数据所上报的数据只是按照指定的协议所编码,上报的数据流也不够紧凑,如我们直接存储这类字节流数据也比较大。此时可以将字节流转为其他压缩格式的流,如Protobuf等;
将字节流转为Protobuf流具体流程为:定义Proto文件、生成对应的Proto对象、读取流数据写入Proto对象、序列化Proto对象。
定义Proto文件:
syntax = "proto3";
//包名,通过protoc生成时go文件
package data;
//位置
message position {
int32 type = 1;
int32 lon = 2;
int32 lat= 3;
string status = 4;
}
程序
将字节数据转为Protobuf所生成的对象;
数据流协议为7E头7E尾,简单起见这里就不使用转码了,字节格式如下。
7E-类型-经度-纬度-状态长度-状态
str := "7E0106C1FC5A0160C9640231327E"
buf := bytes.NewBuffer(toBytes(str))
p :=&test.Position{}
//跳过头
buf.Next(1)
//读取类型
var b byte
b,_=buf.ReadByte()
p.Type = int32(b)
//获取经度
lon:=[]byte{0,0,0,0}
buf.Read(lon)
p.Lon=bytesToInt(lon)
//获取纬度
lat:=[]byte{0,0,0,0}
buf.Read(lat)
p.Lat=bytesToInt(lat)
//获取状态
len,_:=buf.ReadByte()
//获取len个长度的字节数组
data:= buf.Next(int(len))
p.Status=string(data)
fmt.Println("对象输出:",p.String())
fmt.Println("Protobuf序列化: ",hex.EncodeToString(pData))
fmt.Println("原始数据:",str)
输出结果:
对象输出: type:1 lon:113376346 lat:23120228 status:"12"
Protobuf序列化: 080110daf8873618e492830b22023132
原始数据: 7E0106C1FC5A0160C9640231327E
由于这个例子数据字段比较少,并没有看出Protobuf序列化的优势,具体对比可看这篇文章:透过byte数组简单分析Java序列化、Kryo、ProtoBuf序列化
FEATURED TAGS
Agent
大模型
ChatGPT
HA
智能家居
LSM
Linux
Dapr
开发
插件
Linux,虚拟机,ubuntu
缓存
图片
Flink
反射
内置函数
go
限流
大数据,Spark,Kafka
面向对象
镜像
docker,hadoop,镜像
kafka,java
求导
链式法则
微积分
源码
快照
协议
ZooKeeper
ZAB
tomcat
Hadoop
Spark
python
自动微分
React Native
React
Node.js
Android
Kafka
lambda
jvm
rasp
框架
SPI
asm
maven
idea
依赖管理
module
helm
逻辑回归
S函数
IOS
Fiddler
Andriod
Protocol Buffer
kryo
车联网,大数据,神经网络
字节序
最小二乘法
线性代数
线性回归
最大似然法
网络编程
大数据
树莓派
Raspbian
redis
海南
分析
人口
函数式编程
clojure
线程
并行
actor
红黑树
数组
动态数组
tcp
编程
markdown
二叉搜索树
AVL树
数据结构
golang
梯度下降法
skaffold
k8s
机器学习
选法
一致性
算法
分布式
paxos
Raft
一致性协议
引擎
容器
通信
微服务
Kubernetes
docker
文件系统
NFS
神经网络
神经元
深度学习
poi
反向传播
java
并发模型
并发
多线程
Scala