使用C ++中的MsgPack读取二进制文件

时间:2017-03-16 14:58:08

标签: c++ msgpack

我想使用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是输入二进制文件。

3 个答案:

答案 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());