在 C++ 中使用 MsgPack 读取二进制文件
Read Binary file using MsgPack in C++
我想用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;
}
它可以得到第一个数字“3”。
我希望得到号码:
3
[3 6 7 5 3 5]
[6 2 9 1 2 7]
[0 9 3 6 0 6]
而here是输入的二进制文件。
我觉得这里有问题:buffer.str().size()
你可以试试
buffer.str().length()
或strlen(buffer.str().data().c_str());
您的代码仅解压缩一条 msgpack 消息(第一个,即 3 条),但实际上您的文件包含 4 条消息。所以你可以使用msgpack::unpacker
class 将所有消息一一解包。
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。
阅读 并停止使用 #include <bits/stdc++.h>
。
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;
}
}
我相信这是基于您的原始代码的方法。
我想用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;
}
它可以得到第一个数字“3”。
我希望得到号码:
3
[3 6 7 5 3 5]
[6 2 9 1 2 7]
[0 9 3 6 0 6]
而here是输入的二进制文件。
我觉得这里有问题:buffer.str().size()
你可以试试
buffer.str().length()
或strlen(buffer.str().data().c_str());
您的代码仅解压缩一条 msgpack 消息(第一个,即 3 条),但实际上您的文件包含 4 条消息。所以你可以使用msgpack::unpacker
class 将所有消息一一解包。
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。
阅读 #include <bits/stdc++.h>
。
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;
}
}
我相信这是基于您的原始代码的方法。