首頁 > 後端開發 > Golang > 如何在 Go 中解組未知的 Protobuf 訊息?

如何在 Go 中解組未知的 Protobuf 訊息?

Linda Hamilton
發布: 2024-12-03 02:15:10
原創
758 人瀏覽過

How to Unmarshal Unknown Protobuf Messages in Go?

在 Go 中解組未知的 Protobuf 訊息

將 protobuf 訊息解組到介面{}以促進型別轉換是不可行的,因為 proto.Unmarshal函數需要一個類型的參數proto.Message,具體protobuf類型的介面

已知元資料的替代方法

如果至少有一些上下文資訊(例如字串或數字)伴隨字節切片,您可以使用該資訊來映射到預期的protobuf 類型並在將其傳遞給proto.Unmarshal先前實例化它:

func decodeWithMetadata(data []byte, identifier string) error {
    var message proto.Message
    switch identifier {
        case "foo":
            message = &mypb.Foo{}
        case "bar":
            message = &mypb.Bar{}
    }
    if err := proto.Unmarshal(data, message); err != nil {
        return err
    }
    log.Printf("%v\n", data)
    return nil
}
登入後複製

解析完全未知的有效負載

但是,如果位元組有效負載完全未知,請考慮protowire 包,它允許從有線格式的protobuf 訊息中提取有限的資訊。請記住,protobuf 訊息的線路表示不明確,導致語意較弱。

解析器實作

以下程式碼解析未知的 protobuf 訊息:

type Field struct {
    Tag Tag
    Val Val
}

type Tag struct {
    Num int32
    Type protowire.Type
}

type Val struct {
    Payload interface{}
    Length int
}

func parseUnknown(b []byte) []Field {
    // ... implementation to parse unknown protobuf messages as described in the provided answer ...
}
登入後複製

範例用法

給定一個 protobuf模式像:

message Foo {
  string a = 1;
  string b = 2;
  Bar bar = 3;
}

message Bar {
  string c = 1;
}
登入後複製

以下程式碼示範如何使用解析器:

// Parse the protobuf message as byte slice
b := []byte{0x0a, 0x01, 0x41, 0x12, 0x01, 0x42, 0x1a, 0x03, 0x43}
fields := parseUnknown(b)
for _, field := range fields {
    fmt.Printf("%#v\n", field)
}
登入後複製

輸出:

main.Field{Tag:main.Tag{Num:1, Type:2}, Val:main.Val{Payload:[]uint8{0x41}, Length:1}}
main.Field{Tag:main.Tag{Num:2, Type:2}, Val:main.Val{Payload:[]uint8{0x42}, Length:1}}
main.Field{Tag:main.Tag{Num:1, Type:2}, Val:main.Val{Payload:[]uint8{0x43}, Length:1}}
main.Field{Tag:main.Tag{Num:3, Type:2}, Val:main.Val{Payload:[]main.Field{main.Field{Tag:main.Tag{Num:1, Type:2}, Val:main.Val{Payload:[]uint8{0x43}, Length:1}}}, Length:3}}
登入後複製

以上是如何在 Go 中解組未知的 Protobuf 訊息?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板