在 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;
    }

}

我相信这是基于您的原始代码的方法。