我有一個 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可能有固定大小結構的選項,但它們通常也會壓縮,這將再次產生可變長度的消息。
如果您描述了您試圖最終解決的問題,我們可能會建議其他替代方案。

慕村9548890
TA貢獻1884條經驗 獲得超4個贊
您正在調用len()
一個字節數組。它將計算該數組中元素的數量,并返回它。
如果您剛剛實例化了一個新的、空的、內部沒有任何內容的 protobuf 指針對象,那么封送處理的字節數組將不會保存任何數據——這就是為什么您得到0
.
我很不確定你想讓它返回什么。你能用你想要的輸出來澄清你的問題嗎?我也許可以更好地回答你的問題。
- 2 回答
- 0 關注
- 151 瀏覽
添加回答
舉報
0/150
提交
取消