# Encoding
- Protocol Buffers의 binary wire format 설명
- Base 128 Varints: 마지막을 제외한 모든 바이트는 MSB가 세팅됨. 나머지 7비트들의 그룹으로 2의보수를 구성. least significant group이 먼저임.
  1 == 0000 0001
  300 == 1010 1100 0000 0010
 - Message Structure: 키/값 구조, 메시지의 바이너리 버전에서 키 => 필드넘버와 wire_type.
  key: (field_number << 3) | wire_type
TypeMeaningUsed For
0 Varint int32, int64, uint32, uint64, sint32, sint64, bool, enum
1 64-bit fixed64, sfixed64, double
2 Length-delimited string, bytes, embedded messages, packed repeated fields
3 Start group groups (deprecated)
4 End group groups (deprecated)
5 32-bit fixed32, sfixed32, float
 
----------------------------------------------------------------
예제) SomeMsg.proto
message SomeMessage {
  required int32 field1 = 1;
  required int32 field2 = 300;
}
SecondMessage msg = SecondMessage.newBuilder().setField1(10).setField2(20).build();

00001000 => field_number = 1wire_type = 0
00001010 => 8 + 2 = 10
11100000 => field_number = 1100(and...)wire_type = 0
00010010 => field_number = 10010 1100 = 256 + 32 + 8 + 4 = 300
00010100 => 16 + 4 = 20
---------------------------------------------------------------- 
 - More Value Types
- Signed Integers: 음수의 경우 sint32가 int32보다 효율적
- Non Varint Numbers: 32bit = type 5, 64bit = type 1
- Strings: type 2, string, bytes, embedded messages, packed repeated fields
- Embedded Messages: 
- Optional And Repeated Elements: repeated 필드는 같은 태그넘버를 갖는 0개 이상의 key-value pairs. 연속되지 않고 다른 필드들과 섞여 있을수도 있음. 파싱될 때 순서 보존됨. 메시지에 하나의 (optional 혹은 required) 필드가 두 번 이상 나타나면 파서는 마지막 값을 취함. Embedded Message 필드의 경우 병합함.
- Packed Repeated Fields: 2.1.0버전부터 추가됨, [packed=true] 옵션, 0개의 엘리먼트를 포함한 필드는 메시지에 나타나지 않고, 1개이상이면 type 2 (length delimited) 방식. repeated primitive numeric 필드만  packed가 될 수 있음.
- Field Order: 필드넘버 순서대로 저장하는 게 좋음 (제공된 C++, Java, Python serialization 코드에서처럼), 하지만 파서는 임의 순서여도 파싱할 수 있어야 함.
unknown 필드는 Java, C++ 파서는 known 필드를 순서대로 저장한 뒤에 임의순서로 붙임. Python은 known 필드를 무시함.
 
Posted by 天下太平
,