首页  >  文章  >  Java  >  如何在 C 语言中为 Protocol Buffer 实现定界 I/O?

如何在 C 语言中为 Protocol Buffer 实现定界 I/O?

Susan Sarandon
Susan Sarandon原创
2024-10-30 02:47:03772浏览

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

Protocol Buffers 中的分隔 I/O 函数:C 等效项

在从两个协议缓冲区中的文件读取或写入多个 Protocol Buffers 消息的情况下C 和 Java,有必要在消息中附加长度前缀。虽然 Java API 为此目的提供了专用的“定界”I/O 函数,但它们在 C 中的等效函数可能并不明显。

最近的更新表明此类 C 等效函数现在驻留在 google/protobuf/util 中/delimited_message_util.h 作为版本 3.3.0 的一部分。然而,在此更新之前,有一些替代实现可以有效地满足此要求。

其中一个实现由 C 和 Java protobuf 库的前作者提供,包括防止 64MB 输入后潜在故障的优化。如下图所示,这些实现对单个消息强制实施 64MB 限制,确保流式传输无缝继续进行而不超过总体限制。

针对 C 的优化定界 I/O 实现

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

这些优化的实现有效地处理不同大小的消息,并为 C 中的分隔 I/O 提供可靠的解决方案。

以上是如何在 C 语言中为 Protocol Buffer 实现定界 I/O?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn