Rumah >Java >javaTutorial >Bagaimana untuk Melaksanakan I/O Terhad dalam C untuk Penampan Protokol?

Bagaimana untuk Melaksanakan I/O Terhad dalam C untuk Penampan Protokol?

Susan Sarandon
Susan Sarandonasal
2024-10-30 02:47:03854semak imbas

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

Fungsi I/O Terhad dalam Penampan Protokol: Setara C

Dalam senario di mana berbilang mesej Penampan Protokol dibaca atau ditulis daripada fail dalam kedua-dua fail C dan Java, ia menjadi perlu untuk melampirkan awalan panjang pada mesej. Walaupun API Java menyediakan fungsi I/O "Terhad" khusus untuk tujuan ini, rakan sejawatannya dalam C mungkin tidak dapat dilihat dengan mudah.

Kemas kini terkini menunjukkan bahawa setara C tersebut kini berada dalam google/protobuf/util /delimited_message_util.h sebagai sebahagian daripada versi 3.3.0. Walau bagaimanapun, sebelum kemas kini ini, terdapat pelaksanaan alternatif yang menangani keperluan ini dengan cekap.

Satu pelaksanaan sedemikian, yang disediakan oleh bekas pengarang perpustakaan protobuf C dan Java, termasuk pengoptimuman yang menghalang kemungkinan kegagalan selepas 64MB input . Pelaksanaan ini, seperti yang digambarkan di bawah, menguatkuasakan had 64MB pada mesej individu, memastikan penstriman diteruskan dengan lancar tanpa melebihi had keseluruhan.

Pelaksanaan I/O Terhad Dioptimumkan untuk C

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

Pelaksanaan yang dioptimumkan ini mengendalikan mesej dengan pelbagai saiz dengan berkesan dan menyediakan penyelesaian yang boleh dipercayai untuk I/O terhad dalam C .

Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan I/O Terhad dalam C untuk Penampan Protokol?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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