gpt4 book ai didi

c++ - 将多个 protobuf 编码到文件

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:13:29 25 4
gpt4 key购买 nike

背景:

我正在使用 Google 的 protobuf ,我想使用 C++ 将几千兆字节的 protobuf 编码数据读/写到一个文件中。由于建议将每个 protobuf 对象的大小保持在 1MB 以下,我认为将二进制流(如下图所示)写入文件是可行的。每个偏移量都包含到下一个偏移量的字节数,直到到达文件末尾。这样,每个 protobuf 都可以保持在 1MB 以下,我可以将它们组合在一起以达到我的心意。

[int32 offset]
[protobuf blob 1]
[int32 offset]
[protobuf blob 2]
...
[eof]

我有一个可以在 Github 上运行的实现:

src/glob.hpp
src/glob.cpp
test/readglob.cpp
test/writeglob.cpp

但我觉得我写了一些糟糕的代码,希望能得到一些关于如何改进它的建议。因此,

问题:

  • 我正在使用 reinterpret_cast<char*>从二进制 fstream 读取/写入 32 位整数.因为我使用的是 protobuf,所以我假设所有机器都是小端。我还断言 int确实是4个字节。 有没有更好的方法将 32 位整数读/写到二进制 fstream 鉴于这两个限制性假设?
  • 正在阅读 fstream ,我创建了一个临时的固定长度 char缓冲区,这样我就可以将这个固定长度的缓冲区传递给 protobuf 库以使用 ParseFromArray 进行解码, 作为 ParseFromIstream将消耗整个流。我真的更愿意告诉图书馆最多阅读下一个 N来自 fstream 的字节,但 protobuf 中似乎没有该功能。 传递函数最多 N 个字节的 fstream 的最惯用方法是什么? ? 还是我的设计完全颠倒了,我应该考虑完全不同的方法?

编辑:

  • @ codymanix : 我正在转换到 char istream::read 需要 char数组如果我没记错的话。我也没有使用提取运算符 >>因为我读到它与二进制流一起使用的形式很差。或者这最后一条建议是假的?
  • @ Martin York : 已删除 new/delete赞成std::vector<char> . glob.cpp现已更新。谢谢!

最佳答案

不要使用 new[]/delete[]。

取而代之的是 std::vector,因为在发生异常时保证释放。

不要假设读取​​会返回您请求的所有字节。
检查 gcount() 以确保您得到了您所要求的。

而不是让 Glob 根据构造函数中的开关来实现输入和输出的代码。而是实现两个专门的类,如 ifstream/ofstream。这将简化界面和使用。

关于c++ - 将多个 protobuf 编码到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3513028/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com