”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 如何在 C++ 中为 Protocol Buffer 实现定界 I/O?

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

发布于2024-11-26
浏览:599

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

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 中的分隔 I/O 提供可靠的解决方案。

最新教程 更多>
  • 为什么使用Firefox后退按钮时JavaScript执行停止?
    为什么使用Firefox后退按钮时JavaScript执行停止?
    导航历史记录问题:JavaScript使用Firefox Back Back 此行为是由浏览器缓存JavaScript资源引起的。要解决此问题并确保在后续页面访问中执行脚本,Firefox用户应设置一个空功能。 警报'); }; alert('inline Alert')...
    编程 发布于2025-04-17
  • 解决MySQL错误1153:数据包超出'max_allowed_packet'限制
    解决MySQL错误1153:数据包超出'max_allowed_packet'限制
    mysql错误1153:故障排除比“ max_allowed_pa​​cket” bytes 更大的数据包,用于面对阴谋mysql错误1153,同时导入数据capase doft a Database dust?让我们深入研究罪魁祸首并探索解决方案以纠正此问题。理解错误此错误表明在导入过程中接...
    编程 发布于2025-04-17
  • 如何在无序集合中为元组实现通用哈希功能?
    如何在无序集合中为元组实现通用哈希功能?
    在未订购的集合中的元素要纠正此问题,一种方法是手动为特定元组类型定义哈希函数,例如: template template template 。 struct std :: hash { size_t operator()(std :: tuple const&tuple)const {...
    编程 发布于2025-04-17
  • Python 3高效搜索替换文件文本方法
    Python 3高效搜索替换文件文本方法
    使用python 3 响应: 潜在的问题与地上替换: 要解决这个问题,避免同时阅读并写入文件。相反,请按照以下步骤操作: 将文件读取到内存中:有效性: 考虑:推荐方法可能不适用于在单个操作中无法加载到内存中的大文件。在这种情况下,请考虑写入临时文件,然后用修改版本替换原始文件。
    编程 发布于2025-04-17
  • FastAPI中的缓存:开启高性能开发
    FastAPI中的缓存:开启高性能开发
    在当今的数字世界中,每个动作(无论是在约会应用程序上刷还是完成购买)上的API在幕后有效地工作。作为后端开发人员,我们知道每毫秒都很重要。但是,我们如何使API响应速度更快?答案在于缓存。 缓存是一种将经常访问的数据存储在内存中的技术,允许API立即响应,而不是每次都查询较慢的数据库。可以将其视为将...
    编程 发布于2025-04-17
  • 如何正确使用与PDO参数的查询一样?
    如何正确使用与PDO参数的查询一样?
    在pdo 中使用类似QUERIES在PDO中的Queries时,您可能会遇到类似疑问中描述的问题:此查询也可能不会返回结果,即使$ var1和$ var2包含有效的搜索词。错误在于不正确包含%符号。通过将变量包含在$ params数组中的%符号中,您确保将%字符正确替换到查询中。没有此修改,PDO...
    编程 发布于2025-04-17
  • C++中如何将独占指针作为函数或构造函数参数传递?
    C++中如何将独占指针作为函数或构造函数参数传递?
    在构造函数和函数中将唯一的指数管理为参数 unique pointers( unique_ptr [2启示。通过值: base(std :: simelor_ptr n) :next(std :: move(n)){} 此方法将唯一指针的所有权转移到函数/对象。指针的内容被移至功能中,在操作...
    编程 发布于2025-04-17
  • 左连接为何在右表WHERE子句过滤时像内连接?
    左连接为何在右表WHERE子句过滤时像内连接?
    左JOIN CONUNDRUM:WITCHING小时在数据库Wizard的领域中变成内在的加入很有趣,当将c.foobar条件放置在上面的Where子句中时,据说左联接似乎会转换为内部连接。仅当满足A.Foo和C.Foobar标准时,才会返回结果。为什么要变形?关键在于其中的子句。当左联接的右侧值...
    编程 发布于2025-04-17
  • Go语言垃圾回收如何处理切片内存?
    Go语言垃圾回收如何处理切片内存?
    Garbage Collection in Go Slices: A Detailed AnalysisIn Go, a slice is a dynamic array that references an underlying array.使用切片时,了解垃圾收集行为至关重要,以避免潜在的内存泄...
    编程 发布于2025-04-17
  • HTML格式标签
    HTML格式标签
    HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
    编程 发布于2025-04-17
  • 版本5.6.5之前,使用current_timestamp与时间戳列的current_timestamp与时间戳列有什么限制?
    版本5.6.5之前,使用current_timestamp与时间戳列的current_timestamp与时间戳列有什么限制?
    在时间戳列上使用current_timestamp或MySQL版本中的current_timestamp或在5.6.5 此限制源于遗留实现的关注,这些限制需要对当前的_timestamp功能进行特定的实现。 创建表`foo`( `Productid` int(10)unsigned not n...
    编程 发布于2025-04-17
  • 在C#中如何高效重复字符串字符用于缩进?
    在C#中如何高效重复字符串字符用于缩进?
    在基于项目的深度下固定字符串时,重复一个字符串以进行凹痕,很方便有效地有一种有效的方法来返回字符串重复指定的次数的字符串。使用指定的次数。 constructor 这将返回字符串“ -----”。 字符串凹痕= new String(' - ',depth); console.Wr...
    编程 发布于2025-04-17
  • Maven快照在持续集成中的作用及使用
    Maven快照在持续集成中的作用及使用
    揭开Maven快照:连续集成的开发人员工具什么是maven快照? maven快照版本是指在开发过程中不断发展的依赖性。与被认为稳定和最终的“发行版”版本不同,快照被认为是“正在进行的工作”版本。它们代表了对项目或库进行的最新更改。实时更新:快照使开发人员可以立即访问和集成对依赖关系的最新更改。通...
    编程 发布于2025-04-17
  • 大型C++项目中如何识别和删除冗余#include指令?
    大型C++项目中如何识别和删除冗余#include指令?
    Identifying Redundant #include Directives in Extensive C ProjectsWorking with庞大的 C 项目时,开发者经常会遇到过多的 #include 指令,其中一些可能已成为程序中无必要的代码。这些冗余的指令可能会是代码中的历...
    编程 发布于2025-04-17
  • Python元类工作原理及类创建与定制
    Python元类工作原理及类创建与定制
    python中的metaclasses是什么? Metaclasses负责在Python中创建类对象。就像类创建实例一样,元类也创建类。他们提供了对类创建过程的控制层,允许自定义类行为和属性。在Python中理解类作为对象的概念,类是描述用于创建新实例或对象的蓝图的对象。这意味着类本身是使用类关...
    编程 发布于2025-04-17

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3