2014-03-03 41 views
1

不知道我是否只是使用它錯誤,因爲這不是我的專業領域,但我的印象是這應該給我一個完整的解碼openframeworks緩衝區(或簡單串,我想盡各種辦法都導致同一太短字符串):Poco :: Base64Decoder流沒有返回完整字符串

string str; // string is a line from a file handle and shows to be ok in the debugger 
istringstream istr(str); 
Poco::Base64Decoder b64in(istr); 
ofBuffer buffer; 
b64in >> buffer; 

現在一個例子的base64字符串我正在解碼是這一行:

I2J1bmRsZQAAAAAAAAAAAQAAABwvT1NDL1NwYWNlSW50ZW5zaXR5ACxmAAA6nUlSAAAAFC9PU0MvU3BlZWQAACxmAAA90/fPAAAAGC9PU0MvU21vb3RobmVzcwAsZgAAP2Wu5gAAABQvT1NDL1JlYWNoAAAsZgAAPnxQSAAAABgvT1NDL0RlbnNpdHkAAAAALGYAAAAAAAAAAAAYL09TQy9Db2hlcmVuY2UAACxmAAA+tYEGAAAAIC9PU0MvVHJhdmVsSW50ZW5zaXR5AAAAACxmAAA8eQlsAAAAFC9PU0MvUmh5dGhtACxmAAA+6LQ5AAAAGC9PU0MvSGFybW9ueQAAAAAsZgAAPui0OQAAABQvT1NDL0VuZXJneQAsZgAAPYznBA== 

行不解析爲一個簡單的ascii文本,而是一些原始的osc數據包被base64轉儲了一些v vvv補丁我沒有訪問...所以我想這也可能是一個編碼問題?

和我在輸出中得到的所有信息,無論我使用streamcopier還是像上面這樣的運算符,都只是「#bundle」。這可能會以某種方式與「#bundle」之後的/角色或其他非標準內容相關?我的印象是,Base64Decoder並不關心空白或任何它在解碼數據中找到的東西。

+1

'std :: string'不是一個字節緩衝區!它實際上關心諸如NULL字符和控制字符之類的東西。 – Paranaix

+1

@Paranaix - std :: string可以存儲控制字符。問題在於,如果程序員明確使用string :: append(),或者使用帶有char *和integer的兩個參數構造函數構造字符串,則只能這樣做。 – PaulMcKenzie

+0

感謝您的快速評論。但是在這裏我使用了一個字節緩衝區,所以只有輸入行是一個字符串。我在想,base64解碼器的輸出不應該關心空白,只是返回所有字符,無論它們實際表示什麼。還有什麼其他方式來檢索base64解碼器的內容?來自波科的複印機返回了相同的結果。 – DasAntonym

回答

4

,所以我結束了不使用操作,而是複製base64decoder的輸出流,然後從得到的字符串:

istringstream istr(str); 
ostringstream ostr; 
Poco::Base64Decoder b64in(istr); 
copy(std::istreambuf_iterator<char>(b64in), 
    std::istreambuf_iterator<char>(), 
    std::ostreambuf_iterator<char>(ostr)); 
cout << ostr.str(); // returns full decoded output 
1

這實際上無關與波科:: Base64Decoder。 std :: string的流提取操作符將停止在輸入流中遇到的第一個空格字符(Base64Decoder將是解碼數據)。