liaogang
liaogang

Reputation: 518

About protobuf repeating varint decoding

I use charles and got a protobuf http message from other iOS applications. Now I want to genereate the same http packet but the output is not the same. Other App's message

My protobuf file:

message TTCreateConversationBody
{
    repeated uint32 imUid1 = 2;
}

I'm using objective-c:

    TTCreateConversationBody *body = [TTCreateConversationBody new];

    GPBUInt32Array *arr = [[GPBUInt32Array alloc] initWithCapacity:2];
    [arr addValue:123123];
    [arr addValue:9999999];

    body.imUid1Array = arr;

and my output, charles decode it as a length-delimited string:

my output

it's raw data and mine:

8A-26-10-08-01-10-AE-F7-81-80-9F-03-10-D4-E4-82-F0-D2-01
8A-26-10-08-01-12-0C-F9-F6-C3-9D-FA-02-AE-F7-81-80-9F-03

What's the correct protobuf file format?

Upvotes: 1

Views: 727

Answers (1)

Marc Gravell
Marc Gravell

Reputation: 1062502

They're actually both valid... ish.

This comes down to "packed" fields; without "packed", your two integers are encoded as

  • [header, varint][value][header, varint][value]
  • [10][AE-F7-81-80-9F-03][10][D4-E4-82-F0-D2-01]

where-as with "packed", it becomes

  • [header, string][length][value][value]
  • [12][0C][F9-F6-C3-9D-FA-02][AE-F7-81-80-9F-03]

note: the actual values look very different in the two runs... I'm assuming that is accidental.

To quote from the specification:

Protocol buffer parsers must be able to parse repeated fields that were compiled as packed as if they were not packed, and vice versa. This permits adding [packed=true] to existing fields in a forward- and backward-compatible way.

So: serializers should write the layout that is defined by whether your data is "packed" or not, but decoders must be able to handle it either way. Some libraries, when encountering data that should be "packed": determine which layout will actually be shorter, and make the final decision based on that. In reality, this can be approximated to "use packed encoding whenever there's at least two items".

Upvotes: 1

Related Questions