"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 프로토콜 버퍼에 대해 C++에서 구분 I/O를 구현하는 방법은 무엇입니까?

프로토콜 버퍼에 대해 C++에서 구분 I/O를 구현하는 방법은 무엇입니까?

2024년 11월 26일에 게시됨
검색:129

 How to Implement Delimited I/O in C   for Protocol Buffers?

프로토콜 버퍼의 구분된 I/O 기능: C 등가물

여러 프로토콜 버퍼 메시지를 두 파일 모두에서 읽거나 쓰는 시나리오에서 C 및 Java에서는 메시지에 길이 접두사를 첨부해야 합니다. Java API는 이 목적을 위해 전용 '구분된' I/O 기능을 제공하지만 C의 해당 기능은 쉽게 눈에 띄지 않을 수 있습니다.

최근 업데이트에 따르면 해당 C 기능은 이제 google/protobuf/util에 있습니다. /delimited_message_util.h 버전 3.3.0의 일부입니다. 그러나 이번 업데이트 이전에는 이 요구 사항을 효율적으로 해결하는 대체 구현이 있었습니다.

C 및 Java protobuf 라이브러리의 전 작성자가 제공한 구현 중 하나에는 64MB 입력 후 잠재적인 오류를 방지하는 최적화가 포함되어 있습니다. . 아래 설명된 대로 이러한 구현은 개별 메시지에 64MB 제한을 적용하여 전체 제한을 초과하지 않고 스트리밍이 원활하게 계속되도록 보장합니다.

C에 최적화된 구분 I/O 구현

bool writeDelimitedTo(
    const google::protobuf::MessageLite& message,
    google::protobuf::io::ZeroCopyOutputStream* rawOutput) {
  // Initialize a CodedOutputStream for each message.
  google::protobuf::io::CodedOutputStream output(rawOutput);

  // Determine the message size and write it as a Varint.
  int size = message.ByteSize();
  output.WriteVarint32(size);

  // Optimize for messages fitting into a single buffer.
  uint8_t* buffer = output.GetDirectBufferForNBytesAndAdvance(size);
  if (buffer != NULL) message.SerializeWithCachedSizesToArray(buffer);
  else message.SerializeWithCachedSizes(&output);

  return true;
}

bool readDelimitedFrom(
    google::protobuf::io::ZeroCopyInputStream* rawInput,
    google::protobuf::MessageLite* message) {
  // Initialize a CodedInputStream for each message.
  google::protobuf::io::CodedInputStream input(rawInput);

  // Read the message size.
  uint32_t size;
  if (!input.ReadVarint32(&size)) return false;

  // Restrict reading to the determined message size.
  google::protobuf::io::CodedInputStream::Limit limit =
      input.PushLimit(size);

  // Parse the message and verify it fits within the limit.
  if (!message->MergeFromCodedStream(&input)) return false;
  if (!input.ConsumedEntireMessage()) return false;

  // Lift the reading restriction.
  input.PopLimit(limit);

  return true;
}

이러한 최적화된 구현은 다양한 크기의 메시지를 효과적으로 처리하고 C의 구분 I/O에 대한 안정적인 솔루션을 제공합니다.

최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3