Golang中將字節流轉為Protobuf


  在接入第三方數據流或接入物聯網設備時,通常這些數據所上報的數據只是按照指定的協議所編碼,上報的數據流也不夠緊湊,如我們直接存儲這類字節流數據也比較大。此時可以將字節流轉為其他壓縮格式的流,如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序列化


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM