>  기사  >  Java  >  프로토콜 버퍼용 Java API v2.1.0에 도입된 \"Delimited\" I/O 함수(parseDelimitedFrom, mergeDelimitedFrom 및 writeDelimitedTo)에 해당하는 C 함수가 있습니까? 그렇지 않다면, ㅎ

프로토콜 버퍼용 Java API v2.1.0에 도입된 \"Delimited\" I/O 함수(parseDelimitedFrom, mergeDelimitedFrom 및 writeDelimitedTo)에 해당하는 C 함수가 있습니까? 그렇지 않다면, ㅎ

DDD
DDD원래의
2024-10-28 22:30:02744검색

Are there C   equivalents for the

C의 프로토콜 버퍼용 구분 I/O 함수

질문:

Java 프로토콜 버퍼용 API v2.1.0에는parseDelimitedFrom, mergeDelimitedFrom 및 writeDelimitedTo를 포함한 "구분된" I/O 함수 세트가 도입되었습니다. 이 함수에 C와 동등한 기능이 있습니까? 그렇지 않다면 C에서 메시지 크기 접두사를 어떻게 처리할 수 있습니까?

답변:

v3.3.0부터 Google은 C에 구분된 I/O 기능을 추가했습니다. google/protobuf/util/delimited_message_util.h의 라이브러리. 그러나 더 많은 최적화를 제공하고 잠재적인 위험을 해결하는 대체 구현이 있습니다.

<code class="cpp">bool writeDelimitedTo(
    const google::protobuf::MessageLite&amp; message,
    google::protobuf::io::ZeroCopyOutputStream* rawOutput) {
  // Create a new coded stream for each message.
  google::protobuf::io::CodedOutputStream output(rawOutput);

  // Write the size.
  int size = message.ByteSize();
  output.WriteVarint32(size);

  // Optimize for messages that fit in a single buffer.
  uint8_t* buffer = output.GetDirectBufferForNBytesAndAdvance(size);
  if (buffer != NULL) {
    message.SerializeWithCachedSizesToArray(buffer);
    return true;
  }

  // Slower path for messages that span multiple buffers.
  message.SerializeWithCachedSizes(&amp;output);
  return !output.HadError();
}

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

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

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

  // Parse the message.
  if (!message->MergeFromCodedStream(&amp;input)) return false;
  if (!input.ConsumedEntireMessage()) return false;

  // Release the limit.
  input.PopLimit(limit);

  return true;
}</code>

이러한 구현은 64MB를 초과하는 크기의 메시지를 적절하게 처리하는 동시에 개별 메시지에 64MB 제한을 적용합니다.

위 내용은 프로토콜 버퍼용 Java API v2.1.0에 도입된 \"Delimited\" I/O 함수(parseDelimitedFrom, mergeDelimitedFrom 및 writeDelimitedTo)에 해당하는 C 함수가 있습니까? 그렇지 않다면, ㅎ의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.