2013-06-27 48 views
0

我有一個函數需要在使用流的庫中使用。實際輸入數據是帶有嵌入式空值的無符號字符緩衝區,實際上每個字節可以是0-255之間的任何字符/整數。帶有嵌入式空值的數據流的流處理錯誤

我有庫的源代碼,可以改變它。鑑於字節這樣的流:

0x30, 0xb, 0x0, 0x6, 0x6 

如果我使用從字符緩衝區構造一個std :: istringstream流,只要在read_stream功能達到爲0x0,偷看返回EOF ???

當我嘗試將流的內容複製到矢量流時,處理在到達空字符時停止。我怎樣才能解決這個問題。我想將所有的二進制字符複製到矢量中。

#include <vector> 
#include <iostream> 
#include <sstream> 

static void read_stream(std::istream& strm, std::vector<char>& buf) 
{ 
    while(strm) { 
     int c (strm.peek()); 
     if(c != EOF) { // for the 3rd byte in stream c == 0xffffffff (-1) (if using istrngstream) 
     strm.get(); 
     buf.push_back(c); 
     } 
    } 
} 


int main() { 
    char bin[] = {0x30, 0xb, 0x0, 0x6, 0x6, 0x2b, 0xc, 0x89, 0x36, 0x84, 0x13, 0xa, 0x1}; 
    std::istringstream strm(bin); 
    std::vector<char> buf; 
    read_stream(strm, buf); 

    //works fine doing it this way 
    std::ofstream strout("out.bin",std::ofstream::binary); 
    strout.write(bin, sizeof(bin)); 
    strout.close(); 
    std::ifstream strmf("out.bin",std::ifstream::binary); 
    std::vector<char> buf2; 
    read_stream(strmf, buf2); 


    return 0; 
} 

編輯:

我現在的embeeded空在流沒有特別的意義認識。所以這個問題必須與istringstream有關。

+0

零字節在流中沒有特別的意義。它們用於C風格的字符串來終止字符串,但二進制流可以包含任何字節。包含多字節字符的文本文件也可能具有零字節,因爲它們是字符的一部分。 – Barmar

回答

0

你將C風格的字符串(char指針)傳遞給std::istringstream constructor它實際上實例化了一個std::string並通過它。這是由於隱式轉換造成的。 std::string的轉換構造函數將C樣式字符串中的空字節字符解釋爲字符串終止符的結尾,導致其後的所有字符被忽略。

爲了避免這種情況,你可以明確地構造一個std::string指定數據的大小,並把它傳遞給std::istringstream

char bin[] = {0x30, 0xb, 0x0, 0x6, 0x6, 0x2b, 0xc, 0x89, 0x36, 0x84, 0x13, 0xa, 0x1}; 
std::istringstream strm(std::string(bin, sizeof(bin)/sizeof(bin[0]))); 




注:我不確切地知道你在做什麼,但我建議使用std::vector如果可能的話,而不是原始字符緩衝區。