2012-03-08 13 views
1

バイナリファイルを読み込んで16進表現に変換する際に問題があります。C++バイナリファイルを読み込んで16進数に変換する

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 –

+0

@Rob大丈夫ですが、最初の15バイトを再投稿する必要があります。 – technology

+0

これはある種の宿題や学習課題であると仮定すると、ここではいくつかのヒントがあります:(1)あなたは 'while'ループがない、(2)あなたが今開いたストリームの' tellg時期尚早です。 – dasblinkenlight

答えて

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

string ToHex(const string& s, bool upper_case) 

右が、あなたの問題があります。コンストラクタstd::string::string(const char*)は、その入力をナルで終了する文字列として解釈します。したがって、'\0'までの文字だけがToHexに渡されます。

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

大丈夫です...それは16進変換のために働いていました...しかし、私はまだ問題があります:結果はまったく同じではありません。 '47'は' 00'、 '2D'は' 05'です。非ASCII文字もすべてそうです。 – technology

+0

@develroot - 助けがあれば、あなたの 'ToHex'ルーチンにサイン拡張バグがあります。 '(int)s [i]'の代わりに '(s [i]&0xff)'を試してみてください。 –

関連する問題