经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Go语言 » 查看文章
Golang中将字节流转为Protobuf
来源:cnblogs  作者:AiFly  时间:2021/1/4 9:44:43  对本文有异议

在接入第三方数据流或接入物联网设备时,通常这些数据所上报的数据只是按照指定的协议所编码,上报的数据流也不够紧凑,如我们直接存储这类字节流数据也比较大。此时可以将字节流转为其他压缩格式的流,如Protobuf等;
??将字节流转为Protobuf流具体流程为:定义Proto文件、生成对应的Proto对象、读取流数据写入Proto对象、序列化Proto对象。

定义Proto文件:

  1. syntax = "proto3";
  2. //包名,通过protoc生成时go文件
  3. package data;
  4. //位置
  5. message position {
  6. int32 type = 1;
  7. int32 lon = 2;
  8. int32 lat= 3;
  9. string status = 4;
  10. }

程序

将字节数据转为Protobuf所生成的对象;
数据流协议为7E头7E尾,简单起见这里就不使用转码了,字节格式如下。
?? 7E-类型-经度-纬度-状态长度-状态

  1. str := "7E0106C1FC5A0160C9640231327E"
  2. buf := bytes.NewBuffer(toBytes(str))
  3. p :=&test.Position{}
  4. //跳过头
  5. buf.Next(1)
  6. //读取类型
  7. var b byte
  8. b,_=buf.ReadByte()
  9. p.Type = int32(b)
  10. //获取经度
  11. lon:=[]byte{0,0,0,0}
  12. buf.Read(lon)
  13. p.Lon=bytesToInt(lon)
  14. //获取纬度
  15. lat:=[]byte{0,0,0,0}
  16. buf.Read(lat)
  17. p.Lat=bytesToInt(lat)
  18. //获取状态
  19. len,_:=buf.ReadByte()
  20. //获取len个长度的字节数组
  21. data:= buf.Next(int(len))
  22. p.Status=string(data)
  23. fmt.Println("对象输出:",p.String())
  24. fmt.Println("Protobuf序列化: ",hex.EncodeToString(pData))
  25. fmt.Println("原始数据:",str)

输出结果:

对象输出: type:1 lon:113376346 lat:23120228 status:"12"
??Protobuf序列化: 080110daf8873618e492830b22023132
??原始数据: 7E0106C1FC5A0160C9640231327E

由于这个例子数据字段比较少,并没有看出Protobuf序列化的优势,具体对比可看这篇文章:透过byte数组简单分析Java序列化、Kryo、ProtoBuf序列化

原文链接:http://www.cnblogs.com/softlin/p/14220429.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号