亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

golang protobuf 封送固定大小的空結構

golang protobuf 封送固定大小的空結構

Go
呼喚遠方 2023-04-24 17:01:55
我有一個 protobuf 結構Data在.proto:message Data {    uint64 ID = 1;    uint32 GUID = 2;}在高朗b, err := proto.Marshal(&pb.Data{})if err != nil {    panic(err)}fmt.Println(len(b))我有0長度!無論 pb.Data 是什么,我怎樣才能使 proto.Marshal 始終返回固定大?。扛窖?。pb.Data 只包含int64和int32
查看完整描述

2 回答

?
Qyouu

TA貢獻1786條經驗 獲得超11個贊

這里有兩個問題

1) protobuf 對整數使用 varint 編碼,因此大小取決于值,

2) 零值字段默認是不發送的,所以因為兩個整數都是零,所以連它們的字段標識都不發送。

如果將它們都設置為 1,則字節數將多于零,但長度仍不固定,具體取決于值的范圍

因此,通常沒有真正的方法在 protobuf 消息中強制執行固定大小

如果你想要固定長度的消息,你可能最好使用直接的在線結構類型編碼,但是這對于語言互操作來說更難,因為它們都必須定義相同的消息并且你會失去簡單的消息遷移以及 protobuf 提供的所有很酷的東西。

Cap'n Proto可能有固定大小結構的選項,但它們通常也會壓縮,這將再次產生可變長度的消息。

如果您描述了您試圖最終解決的問題,我們可能會建議其他替代方案。


查看完整回答
反對 回復 2023-04-24
?
慕村9548890

TA貢獻1884條經驗 獲得超4個贊

您正在調用len()一個字節數組。它將計算該數組中元素的數量,并返回它。

如果您剛剛實例化了一個新的、空的、內部沒有任何內容的 protobuf 指針對象,那么封送處理的字節數組將不會保存任何數據——這就是為什么您得到0.

我很不確定你想讓它返回什么。你能用你想要的輸出來澄清你的問題嗎?我也許可以更好地回答你的問題。


查看完整回答
反對 回復 2023-04-24
  • 2 回答
  • 0 關注
  • 151 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號