我想使用Cpp读取二进制文件,其类型使用MsgPack。 我不熟悉MsgPack,我尝试读取二进制文件并推入MsgPack。它不起作用。它只是一次又一次得到第一个数字。有人可以帮忙吗?非常感谢。
#include <bits/stdc++.h>
#include <msgpack.hpp>
using namespace std;
int main()
{
std::ifstream ifs("input.txt", std::ifstream::in);
std::stringstream buffer;
buffer << ifs.rdbuf();
msgpack::unpacked upd;
msgpack::unpack(upd, buffer.str().data(), buffer.str().size());
std::cout << upd.get() << std::endl;
return 0;
}
它可以获得第一个数字&#34; 3&#34;。
我希望得到号码:
3
[3 6 7 5 3 5]
[6 2 9 1 2 7]
[0 9 3 6 0 6]
here是输入二进制文件。
答案 0 :(得分:1)
您的代码只解压缩一条msgpack消息(第一条消息,即3条消息)但实际上您的文件包含4条消息。因此,您可以使用msgpack::unpacker
类逐个解压缩所有消息。
int main()
{
std::ifstream ifs("input.txt", std::ifstream::in);
std::string buffer((std::istreambuf_iterator<char>(ifs)),
std::istreambuf_iterator<char>());
msgpack::unpacker pac;
pac.reserve_buffer( buffer.size() );
std::copy( buffer.begin(), buffer.end(), pac.buffer() );
pac.buffer_consumed( buffer.size() );
msgpack::object_handle oh;
while ( pac.next(oh) ) {
msgpack::object msg = oh.get();
std::cout << msg << std::endl;
}
return 0;
}
P.S。
阅读this并停止使用#include <bits/stdc++.h>
。
答案 1 :(得分:1)
msgpack::unpack()
解包第一个MessagePack格式的数据。
我认为3
表示以下数组的数量。
在这种情况下,offset
很有用。见https://github.com/msgpack/msgpack-c/wiki/v2_0_cpp_unpacker#client-controls-a-buffer
以下是将第一个MessagePack数据3
作为计数器读取的代码。然后3次调用msgpack::unpack()
来解压每个数组。
在此过程中,变量offset
会更新。
#include <iostream>
#include <fstream>
#include <msgpack.hpp>
int main()
{
std::ifstream ifs("input.txt");
std::string buffer((std::istreambuf_iterator<char>(ifs)),
std::istreambuf_iterator<char>());
msgpack::unpacked upd;
std::size_t offset = 0;
msgpack::unpack(upd, buffer.data(), buffer.size(), offset);
std::size_t count = upd.get().as<std::size_t>();
std::cout << count << std::endl;
for (std::size_t i = 0; i != count; ++i) {
msgpack::unpack(upd, buffer.data(), buffer.size(), offset);
std::cout << upd.get() << std::endl;
}
}
我认为这是基于原始代码的方法。
答案 2 :(得分:0)
我认为问题在这里:buffer.str().size()
你可以试试
buffer.str().length()
或strlen(buffer.str()。data()。c_str());