2017-03-16 45 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>