練習:Protobuf 剖析
在本練習中,您將建構 protobuf 二進位編碼的剖析器。請放心,這比看起來容易!這個練習也會舉例說明常見的剖析模式,也就是傳遞資料切片。基礎資料本身一律不會複製。
如要完整剖析 protobuf 訊息,您必須瞭解欄位型別,這會依欄位編號建立索引,通常位於 proto
檔案內。在本練習中,我們會在針對各欄位呼叫的函式中,將該資訊編碼為 match
陳述式。
我們將使用以下 proto:
message PhoneNumber {
optional string number = 1;
optional string type = 2;
}
message Person {
optional string name = 1;
optional int32 id = 2;
repeated PhoneNumber phones = 3;
}
proto 訊息會編碼為一系列的欄位,一個接著一個。每個欄位都以後方加上值的「標記」形式實作。此標記含有欄位編號 (例如 Person
訊息的 id
欄位編號是 2
) 以及有線型別,後者負責定義應如何從位元組資料流中決定酬載。
整數 (包含標記) 會以稱為 VARINT 的可變長度編碼表示。好消息是,以下程式碼已為您定義 parse_varint
。該程式碼也定義了回呼,藉此處理 Person
和 PhoneNumber
欄位,並將訊息剖析為對這些回呼的一系列呼叫。
您剩下的就只是為 Person
和 PhoneNumber
實作 parse_field
函式和 ProtoMessage
特徵即可。