2017-03-16 317 views
2

我想使用Cpp读取二进制文件,其类型使用MsgPack。 我不熟悉MsgPack,我尝试阅读二进制文件拳头并推入MsgPack。它不起作用。它只是一次又一次地得到第一个数字。谁能帮忙?非常感谢。在C++中使用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是输入的二进制文件。

回答

0

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

}

我认为,这是基于你的原始代码的方法。

+0

您的解决方案基于您的假设,第一个数字是以下数组的数目。如果这是不正确的,@Gavin Lee只是想解析4条独立消息?至少你可以在for循环中检查'offset'是否仍然小于'buffer.size()'。 – JustRufus

0

我认为这里的问题:buffer.str().size()你可以尝试

buffer.str().length() 

或strlen的;(buffer.str()数据()c_str()。)

+0

std :: string :: size和std :: string :: length是'同义词'。 http://en.cppreference.com/w/cpp/string/basic_string/size – JustRufus

0

您的代码只解压缩一个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>