首页 > 后端开发 > C++ > 如何在 C 中实现协议缓冲区的定界 I/O?

如何在 C 中实现协议缓冲区的定界 I/O?

DDD
发布: 2024-12-06 06:11:12
原创
642 人浏览过

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

在 C 语言中为 Protocol Buffers 实现定界 I/O 函数

在 Java 中,Protocol Buffers 版本 2.1.0 引入了定界 I/O 函数方便从文件中读取和写入多条消息。这些函数 parseDelimitedFrom、mergeDelimitedFrom 和 writeDelimitedTo 通过将长度前缀附加到消息来工作。

最初的问题询问 C 是否存在等效函数。虽然 Java API 提供了这些函数,但官方 C 库最初缺乏它们。但是,从版本 3.3.0 开始,Google 将这些函数添加到 google/protobuf/util/delimited_message_util.h。

如果您使用的是旧版本的 C 库,则可以使用以下方式实现分隔 I/O以下代码:

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;
}
登录后复制

以上是如何在 C 中实现协议缓冲区的定界 I/O?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板