Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Saya Boleh Melaksanakan I/O Terhad untuk Penampan Protokol dalam C?

Bagaimanakah Saya Boleh Melaksanakan I/O Terhad untuk Penampan Protokol dalam C?

DDD
Lepaskan: 2024-12-06 06:11:12
asal
637 orang telah melayarinya

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

Melaksanakan Fungsi I/O Terhad dalam C untuk Penimbal Protokol

Di Java, Protocol Buffers versi 2.1.0 memperkenalkan fungsi I/O yang dibataskan untuk memudahkan membaca dan menulis berbilang mesej daripada fail. Fungsi ini, parseDelimitedFrom, mergeDelimitedFrom, dan writeDelimitedTo, berfungsi dengan melampirkan awalan panjang pada mesej.

Soalan asal bertanya tentang kewujudan fungsi yang setara untuk C . Walaupun API Java menyediakan fungsi ini, perpustakaan C rasmi pada mulanya kekurangannya. Walau bagaimanapun, pada versi 3.3.0, Google menambahkan fungsi ini pada google/protobuf/util/delimited_message_util.h.

Jika anda menggunakan versi pustaka C yang lebih lama, anda boleh melaksanakan I/O terhad menggunakan kod berikut:

bool writeDelimitedTo(
    const google::protobuf::MessageLite& message,
    google::protobuf::io::ZeroCopyOutputStream* rawOutput) {
  // Create a new coded stream for each message.
  google::protobuf::io::CodedOutputStream output(rawOutput);

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

  uint8_t* buffer = output.GetDirectBufferForNBytesAndAdvance(size);
  if (buffer != NULL) {
    // Optimization: Serialize message directly to array if it fits.
    message.SerializeWithCachedSizesToArray(buffer);
  } else {
    // Slower path for messages spanning multiple buffers.
    message.SerializeWithCachedSizes(&output);
    if (output.HadError()) return false;
  }

  return true;
}

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 message size.
  uint32_t size;
  if (!input.ReadVarint32(&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(&input)) return false;
  if (!input.ConsumedEntireMessage()) return false;

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

  return true;
}
Salin selepas log masuk

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

sumber:php.cn
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