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
Lepaskan: 2024-10-30 02:47:03
asal
906 orang telah melayarinya

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

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 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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan