2017-01-13 4 views
2
내가 protobuf-> 파이썬의 샘플 코드를 시도하고 있었다

, 나는 컴파일protobuf 삽입 된 메시지가 여분의 바이트로 연결됩니다.이 delimeter는 무엇입니까?

message Person{ 
    required string name=1; 
    required int32 id=2; 
    optional string email=3; 

    enum PhoneType{ 
     mobile=0; 
     home=1; 
     work=2; 
    } 
    message PhoneNumber{ 
     required string number=1; 
     optional PhoneType type=2[default=home]; 
    } 
    repeated PhoneNumber phone=4; 
} 

pytest.proto있어 그것을

protoc pytest.proty --python_out=./ 

그럼 내 파이썬 파일 :

import pytest_pb2 
import sys 
person=pytest_pb2.Person() 
person.name="bbb" 
person.id=9 

phone_number=person.phone.add() 
phone_number.number="aaa" 
phone_number.type=pytest_pb2.Person.work 
f=open("log4py.data","w") 
s=person.SerializeToString() 
f.write(s) 
f.close() 

실행이 :

$python pytest.py && xxd log4py.data 
00000000: 0a03 6262 6210 0922 070a 0361 6161 1002 ..bbb.."...aaa.. 
      name="bbb" id=9 ??? number="aaa" type=home 
나는 위에서

0a03 6262 62 --> name="bbb" 
1009   --> id=9 
22 07  --> What's this?????????????????? 
0a03 616 161 --> number="aaa" 
1002   --> type=home 

내가 "22 07"여기 뜻의 추가 바이트를 무엇을하지 않았다 볼 수 있습니다, 임베디드 구조가 거기에 표시하는 것? "22 07"두 번 내가 볼,

$python pytest.py && xxd log4py.data 
00000000: 0a03 6262 6210 0922 070a 0361 6161 1002 ..bbb.."...aaa.. 
00000010: 2207 0a03 6363 6310 02     "...ccc.. 

음,이 시간 :

phone_number1=person.phone.add() 
phone_number1.number="aaa" 
phone_number1.type=pytest_pb2.Person.work 
phone_number2=person.phone.add() 
phone_number2.number="ccc" 
phone_number2.type=pytest_pb2.Person.work 

실행을 내가 가지고 : 그래서 다음과 같이, 2 "PHONE_NUMBER"인스턴스를 내 파이썬 프로그램을 변경 각 PhoneNumber 인스턴스 앞에. 나는 Protobuf가 어떠한 delimeter 바이트도 encode하지 않는다는 것을 알았지 만 여기서 "22 07"은 delimeter이다. 설명이 있습니까?

답변

2

바이트는 서브 메시지의 태그 및 길이입니다.

22은 태그입니다. 하위 3 비트 (2)는 다음 필드 값이 길이로 구분 된 값임을 나타냅니다. 상위 5 비트 (4)는 이것이 필드 번호 4 인 것을 나타내며, 이는 phone 필드입니다.

07 길이입니다. 하위 메시지 길이는 7 바이트입니다.

나는 Protobuf 어떤 분리 문자 바이트를 인코딩하지 않는 것을 알고

하지 사실 : 하위 메시지를 어떻게 든 구분해야합니다. Protobuf는 모든 바이트를 디코딩하지 않고 필드를 건너 뛸 수 있기 때문에 특수 종료 태그가 아닌 길이 접두사를 사용하여 구분을 선호합니다.