Rumah > Java > javaTutorial > Adakah terdapat setara C untuk fungsi I/O \'Delimited\' (parseDelimitedFrom, mergeDelimitedFrom, dan writeDelimitedTo) yang diperkenalkan dalam Java API untuk Protocol Buffers v2.1.0? Jika tidak, h

Adakah terdapat setara C untuk fungsi I/O \'Delimited\' (parseDelimitedFrom, mergeDelimitedFrom, dan writeDelimitedTo) yang diperkenalkan dalam Java API untuk Protocol Buffers v2.1.0? Jika tidak, h

DDD
Lepaskan: 2024-10-28 22:30:02
asal
936 orang telah melayarinya

Are there C   equivalents for the

Fungsi I/O Terhad untuk Penampan Protokol dalam C

Soalan:

Java API untuk Protocol Buffers v2.1.0 memperkenalkan satu set fungsi I/O "Terhad", termasuk parseDelimitedFrom, mergeDelimitedFrom dan writeDelimitedTo. Adakah fungsi ini mempunyai setara C? Jika tidak, bagaimanakah awalan saiz mesej boleh dikendalikan dalam C ?

Jawapan:

Sehingga v3.3.0, Google telah menambah fungsi I/O terhad pada C perpustakaan dalam google/protobuf/util/delimited_message_util.h. Walau bagaimanapun, terdapat pelaksanaan alternatif yang menyediakan lebih banyak pengoptimuman dan menangani kemungkinan perangkap:

<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>
Salin selepas log masuk

Pelaksanaan ini memastikan pengendalian mesej yang betul dengan saiz melebihi 64MB, sambil masih menguatkuasakan had 64MB pada mesej individu.

Atas ialah kandungan terperinci Adakah terdapat setara C untuk fungsi I/O \'Delimited\' (parseDelimitedFrom, mergeDelimitedFrom, dan writeDelimitedTo) yang diperkenalkan dalam Java API untuk Protocol Buffers v2.1.0? Jika tidak, h. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan