> Java > java지도 시간 > 프로토콜 버퍼에 대해 C에서 구분 I/O를 구현하는 방법은 무엇입니까?

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

Susan Sarandon
풀어 주다: 2024-10-30 02:47:03
원래의
860명이 탐색했습니다.

 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 구현

<code class="cpp">bool writeDelimitedTo(
    const google::protobuf::MessageLite&amp; 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(&amp;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(&amp;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(&amp;input)) return false;
  if (!input.ConsumedEntireMessage()) return false;

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

  return true;
}</code>
로그인 후 복사

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

위 내용은 프로토콜 버퍼에 대해 C에서 구분 I/O를 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿