2012-03-08 104 views
1

我在讀取二進制文件並將其字節轉換爲十六進制表示時遇到了一些問題。C++讀取二進制文件並將其轉換爲十六進制

我試過到目前爲止:

ifstream::pos_type size; 
char * memblock; 

ifstream file (toread, ios::in|ios::binary|ios::ate); 
    if (file.is_open()) 
    { 
    size = file.tellg(); 
    memblock = new char [size]; 
    file.seekg (0, ios::beg); 
    file.read (memblock, size); 
    file.close(); 

    cout << "the complete file content is in memory" << endl; 

std::string tohexed = ToHex(memblock, true); 


    std::cout << tohexed << std::endl; 

    } 

轉換爲十六進制:

string ToHex(const string& s, bool upper_case) 
{ 
    ostringstream ret; 

    for (string::size_type i = 0; i < s.length(); ++i) 
     ret << std::hex << std::setfill('0') << std::setw(2) << (upper_case ? std::uppercase : std::nouppercase) << (int)s[i]; 

    return ret.str(); 
} 

結果:53514C69746520666F726D61742033

當我打開用十六進制編輯的原始文件,這是它表明:

53 51 4C 69 74 65 20 66 6F 72 6D 61 74 20 33 00 
04 00 01 01 00 40 20 20 00 00 05 A3 00 00 00 47 
00 00 00 2E 00 00 00 3B 00 00 00 04 00 00 00 01 
00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 05 A3 
00 2D E2 1E 0D 03 FC 00 06 01 80 00 03 6C 03 D3 

有沒有辦法用C來獲得相同的期望輸出++?

工作液(羅布):

... 

std::string tohexed = ToHex(std::string(memblock, size), true); 

... 
string ToHex(const string& s, bool upper_case) 
{ 
    ostringstream ret; 

    for (string::size_type i = 0; i < s.length(); ++i) 
    { 
     int z = s[i]&0xff; 
     ret << std::hex << std::setfill('0') << std::setw(2) << (upper_case ? std::uppercase : std::nouppercase) << z; 
    } 

    return ret.str(); 
} 
+0

「memblock只包含前15個字節,停在空字節(第16個)」是什麼讓你說的?我看不出你在哪裏打印出'memblock'的內容。我懷疑'memblock'包含整個文件,但是你沒有向我們展示的代碼誤解了它的內容。請將您的程序減少到顯示錯誤的最小完整程序,並在問題中發佈該程序。 http://sscce.org – 2012-03-08 17:20:07

+0

@Rob好的,我應該轉發前15個字節,讓你更清楚嗎? – technology 2012-03-08 17:21:46

+0

假設這是一項家庭作業或某種學習任務,這裏有幾點提示:(1)缺少一個「while」循環,(2)在剛打開的流上調用tellg()爲時尚早。 – dasblinkenlight 2012-03-08 17:22:22

回答

3
char *memblock; 
… 
std::string tohexed = ToHex(memblock, true); 
… 

string ToHex(const string& s, bool upper_case) 

有你的問題,就在那裏。構造函數std::string::string(const char*)將其輸入解釋爲一個以nul結尾的字符串。因此,只有導致'\0'的字符甚至會傳遞到ToHex。請嘗試以下其中一種方法:

std::string tohexed = ToHex(std::string(memblock, memblock+size), true); 
std::string tohexed = ToHex(std::string(memblock, size), true); 
+0

好的...這對十六進制轉換工作...但我仍然有一個問題:結果不完全相同。 '47'現在是'00',或'2D'現在是'05'..所有非ASCII字符都是如此。 – technology 2012-03-08 17:38:59

+0

@develroot - 如果有幫助,你的'ToHex'例程中有一個符號擴展錯誤。嘗試'(s [i]&0xff)'而不是'(int)s [i]'。 – 2012-03-08 17:53:19

相關問題