首页 >Java >java教程 >如何在 C 语言中为 Protocol Buffer 实现定界 I/O 函数?

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

Barbara Streisand
Barbara Streisand原创
2024-10-29 13:16:02302浏览

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

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

在 C 中,没有与“分隔”I 直接等效的函数/O 函数在 Java 的 Protocol Buffers API 版本 2.1.0 中引入。这些函数允许读取和写入附加长度前缀的多个 Protocol Buffers 消息。

Java 分隔 I/O 函数的连线格式

Java“分隔”I/ O 函数使用 Google 未记录的有线格式。然而,C 和 Java protobuf 库的作者提供了类似功能的非官方实现:

<code class="cpp">bool writeDelimitedTo(
    const google::protobuf::MessageLite& message,
    google::protobuf::io::ZeroCopyOutputStream* rawOutput) {

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

  // Serialize the message.
  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) {

  // Read the size.
  uint32_t size;
  if (!input.ReadVarint32(&size)) return false;

  // Limit the stream to the size of the message.
  google::protobuf::io::CodedInputStream::Limit limit =
      input.PushLimit(size);

  // Parse the message.
  if (!message->MergeFromCodedStream(&input)) return false;

  // Verify that the entire message was consumed.
  if (!input.ConsumedEntireMessage()) return false;

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

  return true;
}</code>

这些实现确保 64MB 大小限制单独应用于每条消息,而不是整个流。此外,当消息大小相对较小时,他们利用优化来提高性能。

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

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