我有一个包含多个 Capnp 消息的二进制文件,我想阅读这些消息。按顺序阅读效果很好,但我有一个用例,我想跳到以前已知的位置。具有元数据的数据顺序图像,包括时间戳。我希望有可能来回跳跃(就像在视频播放器中一样)。
这是我尝试过的:
int fd = open(filePath.c_str(), O_RDONLY);
kj::FdInputStream fdStream(fd);
kj::BufferedInputStreamWrapper bufferedStream(fdStream);
for (;;) {
kj::ArrayPtr<const kj::byte> framePtr = bufferedStream.tryGetReadBuffer();
if (framePtr != nullptr) {
capnp::PackedMessageReader message(bufferedStream);
// This should reset the buffer to the last read message?
bufferedStream.read((void*)framePtr.begin(), framePtr.size());
// ...
}
else {
// reset to beginning
}
}
但我得到这个错误:
capnp/serialize.c++:186: failed: expected segmentCount < 512; Message has too many segments
我假设tryGetReadBuffer()
返回下一个打包消息的位置和大小。但话又说回来,BufferedInputStream 应该如何知道“消息”是什么。
问题:如何获取消息的位置和大小,并稍后从 BufferedInputStreamWrapper 读取这些消息?
替代方案:读取整个文件一次,获取数据的所有权并将其保存到向量中。如此处所述(https://groups.google.com/forum/#!topic/capnproto/Kg_Su1NnPOY)。一直都有更好的解决方案?