2017-11-24 7 views
2

다음 프로토 파일을 고려하십시오."필드의 .proto 파일에있는 태그 번호"와 "생성 된 코드에서의 숫자 (스위치 케이스를 통한 구문 분석에 사용)"사이의 관계는 무엇입니까?

syntax="proto3"; 
message MessageWithInternalMessage { 
    string F1 = 1; 
    _S1 s2 = 5; 
    message _S1 { 
     string C1 = 1; 
     string C2 = 2; 
    } 
} 

우리가 코드를 생성 할 때. 구문 분석은 readTag() 및 switch 문을 사용하여 해당 필드를 설정합니다. 또는 다음 스 니펫을 고려하십시오.

while (!done) { 
    int tag = input.readTag(); 
    switch (tag) { 
     case 0: 
      done = true; 
      break; 
     default: { 
      if (!parseUnknownFieldProto3(input, unknownFields, extensionRegistry, tag)) { 
       done = true; 
      } 
      break; 
     } 
     case 10: { 
      java.lang.String s = input.readStringRequireUtf8(); 
      f1_ = s; 
      break; 
     } 
     case 42: { 
      Test.InternalMessageWithSeciton._S1.Builder subBuilder = null; 
      if (s2_ != null) { 
      subBuilder = s2_.toBuilder(); 
      } 
      s2_ = input.readMessage(Test.InternalMessageWithSeciton._S1.parser(), extensionRegistry); 
      if (subBuilder != null) { 
       subBuilder.mergeFrom(s2_); 
       s2_ = subBuilder.buildPartial(); 
      } 
      break; 
     } 
    } 
} 

질문 프로토 파일의 "필드 F1에 대한 태그 (1)"의 관계가 무엇을 행 "케이스 (42)"필드 (S2)에 대한 태그 (5) "및 "케이스 (10)에서 생성 한 코드에서 " 생성 된 코드에서 ".

답변

2

헤더의 인코딩 형식은 기본적으로 다음 "선 유형"정수

  • 0 0 내지 7 = varint이다

    header = (fieldNumber << 3) | expectedWireType; 
    

    - 연속으로베이스 128 인코딩 정수 비트

  • 1 = 64 비트 (정수 또는 부동 소수점)
  • 2 = 프리픽스 길이 데이터 - 많은 바이트가 바이트 수의 varint (문자열 BLOB를 서브 혼란 연령, 포장 배열)
  • 5 = 32 비트 (정수 또는 부동 소수점)

그래서 문자열로 필드 1 (1 < < 3) | 서브 메시지로서의 필드 5는 마찬가지로 (5 < <3)이다. 2, 또는 : 42

+0

Gravel "expectedWireType"은 0과 7 사이의 값을 가질 수 있습니다. 어떤 경우에 3,4,6,7을 사용해야합니까? – Ran

+1

@Ran 3과 4는 시작/끝 그룹 마커입니다. 그룹은 주로 사용되지 않으며 일반적으로 필요하지 않습니다. 6 및 7은 향후 사용을 위해 예약되어 있습니다. –