"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيفية تنفيذ الإدخال/الإخراج المحدد في C++ لمخازن البروتوكول المؤقتة؟

كيفية تنفيذ الإدخال/الإخراج المحدد في C++ لمخازن البروتوكول المؤقتة؟

تم النشر بتاريخ 2024-11-26
تصفح:248

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

وظائف الإدخال / الإخراج المحددة في المخازن المؤقتة للبروتوكول: مكافئات C

في السيناريوهات التي تتم فيها قراءة رسائل مخازن البروتوكول المؤقتة المتعددة أو كتابتها من الملفات في كليهما C وJava، يصبح من الضروري إرفاق بادئات الطول بالرسائل. في حين أن Java API توفر وظائف إدخال/إخراج "محددة" مخصصة لهذا الغرض، فإن نظيراتها المكافئة في لغة C قد لا تكون واضحة بسهولة.

يشير التحديث الأخير إلى أن مرادفات لغة C هذه موجودة الآن في google/protobuf/util /delimited_message_util.h كجزء من الإصدار 3.3.0. ومع ذلك، قبل هذا التحديث، كانت هناك تطبيقات بديلة عالجت هذا المطلب بكفاءة.

يتضمن أحد هذه التطبيقات، الذي قدمه مؤلف سابق لمكتبات C وJava protobuf، تحسينات تمنع حالات الفشل المحتملة بعد إدخال 64 ميجابايت . تفرض هذه التطبيقات، كما هو موضح أدناه، حدًا يبلغ 64 ميجابايت على الرسائل الفردية، مما يضمن استمرار التدفق بسلاسة دون تجاوز الحد الإجمالي.

تطبيقات الإدخال / الإخراج المحددة المحسنة لـ C

bool writeDelimitedTo(
    const google::protobuf::MessageLite& 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(&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(&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(&input)) return false;
  if (!input.ConsumedEntireMessage()) return false;

  // Lift the reading restriction.
  input.PopLimit(limit);

  return true;
}
تتعامل هذه التطبيقات المحسنة بشكل فعال مع الرسائل ذات الأحجام المختلفة وتوفر حلاً موثوقًا للإدخال/الإخراج المحدد في لغة C .

أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3