2015-04-07 43 views
0

我想將一些armadillo矩陣保存在json文件中,一旦base64編碼。 這是我工作的一個不完整的代碼示例。 我的問題是從std :: stringstream轉換爲QByteArray,並返回丟失我的stringstream原始(確切)內容。將二進制std :: stringstream內容轉換爲base64(並返回)用Qt

arma::file_type arma_save_format=arma::arma_binary; 
std::stringstream savemedium; 

//init & save 
{ 
    std::stringstream ss1; 
    arma::mat m; 
    m<<1<<2<<3<<arma::endr<<4<<5<<6<<arma::endr<<7<<8<<9; 
    std::cout<<"#1 m:"<<m<<std::endl; 
    m.save(ss1, arma_save_format); 
    savemedium<<ss1.str(); 
} 

/*************************/ 
std::cout<<"inter:"<<savemedium.str()<<std::endl<<std::endl; 
QByteArray ba1; 

//here I'd like to convert savemedium to a base64 QString, probably using a qbyteArray, 
//and convert it back to std::stringstream savemedium 


savemedium.str(""); 
savemedium<< /* ?? */; 

std::cout<<"inter:"<<savemedium.str()<<std::endl<<std::endl; 
/*************************/ 
//restitution 
{ 
    std::stringstream ss2; 
    ss2<<savemedium.str(); 
    arma::mat m2; 
    m2.load(ss2, arma_save_format); 
    std::cout<<"#2:"<<m2<<std::endl; 

} 
+0

您是否嘗試過使用QByteArray的'append'方法和'QString'參數?你可以使用'QString'''fromStdString'將'std :: string'轉換爲'QString'。請參閱:http://doc.qt.io/qt-4.8/qbytearray.html#append-2 – noobProgrammer

+0

是的,我嘗試了一些沒有成功的人。這工作,直到我試圖讓我的原始字符串回到我的std :: stringstream。 – spacm

回答

0

這裏是我得到了它的工作方式:

#include <armadillo> 
#include <iostream> 
#include <QByteArray> 
#include <sstream> 


// to print the content of a QByteArray 
void print(const QByteArray &ba) { 
    QByteArray::const_iterator it=ba.begin(); 
    uint i=0; 
    while (it!=ba.end()) { 
     std::cout<<ba.at(i); 
     i++; 
     it++; 
    } 
} 

int main(int, char **) { 
arma::file_type arma_save_format=arma::arma_binary; 
std::stringstream savemedium; 

//init & save 
{ 
    std::stringstream ss1; 
    arma::mat m; 
    m<<1<<2<<3<<arma::endr<<4<<5<<6<<arma::endr<<7<<8<<9; 
    std::cout<<"#1 m:"<<m<<std::endl; 
    m.save(ss1, arma_save_format); 
    savemedium<<ss1.str(); 
} 


/*************************/ 
std::cout<<"savemedium:"<<std::endl<<savemedium.str()<<std::endl<<std::endl; 

// Here I'd like to convert savemedium to a base64 QString, probably using a qbyteArray, 
// and convert it back to std::stringstream savemedium 
// the following block commented, savemedium is left unmodified and I get the matrix back. 
{ 
    QByteArray ba1; 
    ba1.setRawData(savemedium.str().c_str(), savemedium.str().size()); 

    print(ba1); 
    std::cout<<std::endl<<"ba1 count:"<<ba1.count()<<std::endl<<std::endl; 

    QByteArray b64(ba1.toBase64()); 

    std::cout<<"b64:"<<std::endl; 
    print(b64); 
    std::cout<<std::endl<<std::endl; 

    QByteArray ba2(QByteArray::fromBase64(b64)); 
    std::cout<<"ba2:"<<std::endl; 
    print(ba2); 
    std::cout<<std::endl<<"ba2 count:"<<ba2.count()<<std::endl<<std::endl; 


    std::cout<<"What we get if we just use QByteArray::data()"<<std::endl<<"ba2:"<<std::endl<<ba2.data()<<std::endl; 

    savemedium.str(""); //emptying savemedium so we fill it with decoded data 

    QByteArray & ba=ba2; //just a reference for typing comfort 

    QByteArray::const_iterator it=ba.begin(); 
    uint i=0; 
    while (it!=ba.end()) { 
     savemedium<<ba.at(i); 
     i++; 
     it++; 
    } 
} 
std::cout<<"savemedium:"<<std::endl<<savemedium.str()<<std::endl<<std::endl; 
/*************************/ 
//restitution 
{ 
    std::stringstream ss2; 
    ss2<<savemedium.str(); 
    arma::mat m2; 
    m2.load(ss2, arma_save_format); 
    std::cout<<"#2:"<<m2<<std::endl; 

} 

return 0; 
} 

這給folowwing輸出:

 
#1 m: 1.0000 2.0000 3.0000 
    4.0000 5.0000 6.0000 
    7.0000 8.0000 9.0000 

savemedium: 
ARMA_MAT_BIN_FN008 
3 3 
�[email protected]@@@ @@"@ 

ARMA_MAT_BIN_FN008 
3 3 
�[email protected]@@@ @@"@ 
ba1 count:95 

b64: 
QVJNQV9NQVRfQklOX0ZOMDA4CjMgMwoAAAAAAADwPwAAAAAAABBAAAAAAAAAHEAAAAAAAAAAQAAAAAAAABRAAAAAAAAAIEAAAAAAAAAIQAAAAAAAABhAAAAAAAAAIkA= 

ba2: 
ARMA_MAT_BIN_FN008 
3 3 
�[email protected]@@@ @@"@ 
ba2 count:95 

What we get if we just use QByteArray::data() 
ba2: 
ARMA_MAT_BIN_FN008 
3 3 

savemedium: 
ARMA_MAT_BIN_FN008 
3 3 
�[email protected]@@@ @@"@ 

#2: 1.0000 2.0000 3.0000 
    4.0000 5.0000 6.0000 
    7.0000 8.0000 9.0000 

Press to close this window... 

我用的QByteArray,因爲它有base64編碼方法,和std :: stringstream,因爲犰狳mat :: load()或保存句柄流。當遇到一些特殊字符(我假設'\ 0')時,QByteArray不能用二進制數據安全地輸入,使用< <或append(),這會截斷數據。

這是一個使用的理由:

ba1.setRawData(savemedium.str().c_str(), savemedium.str().size()); 

一旦數據在QByteArray中,這是不平凡的檢索 把它放在一個字符串流: 我這樣做這樣:

QByteArray::const_iterator it=ba.begin(); 
    uint i=0; 
    while (it!=ba.end()) { 
     savemedium<<ba.at(i); 
     i++; 
     it++; 
    } 

歡迎任何更好的解決方案。使用QByteArray :: data()也會截斷二進制數據,可能出於同樣的原因。 感謝您的回答和評論。

相關問題