Как декодировать более одного метри c (несколько потоков) из одного двоичного файла protobuf в golang - PullRequest
1 голос
/ 28 января 2020

Я новичок в GOlang. У меня есть двоичный файл сообщения protobuff, в котором есть несколько сообщений (поток). Способен декодировать это с помощью Python легко, как показано ниже, но не смог найти никакого простого способа добиться того же с использованием GO. Любая помощь будет высоко ценится.

Python код:

def read_pb_stream_from_file():
    amw = my_stream_pb2.MyTestMessageWrapper()
    count = 0
    with open("stream.strmpb",'rb') as f:
        data = f.read()
        n = 0

        while n < len(data):
            msg_len,new_pos = _DecodeVarint32(data,0)
            n = new_pos
            msg_buf = data[n:n+msg_len]
            n += msg_len
            amw.ParseFromString(msg_buf)
            data = data[n:]
            print(count)
            print(amw)
            count+=1

1 Ответ

0 голосов
/ 30 января 2020

Обнаружено, что для этого есть пакет утилит golang -

Часть кода будет выглядеть следующим образом:

Импорт "github.com/matttproud/golang_protobuf_extensions/pbutil"

data, err := ioutil.ReadFile("stream.strmpb")
myTestMessage := &my_stream.MyTestMessageWrapper{}
    in := bytes.NewReader(data)
    // Split proto stream to individual message
    for {
        myTestMessage.Reset()
        if _, err := pbutil.ReadDelimited(in, myTestMessage); err != nil {
            if err == io.EOF {
                break
            }
        }
        // Convert protobuf message to json
        marshaler := jsonpb.Marshaler{}
        jsonMessage, _ := marshaler.MarshalToString(myTestMessage)
        log.Println("jsonMessage:", jsonMessage)
    }
...