2012-06-26 12 views
5

バイナリデータ(エンコーディングなし)で保存された生のイメージファイルがあります。私はファイルを読み込み、値をunsigned charにキャストしたいと思います。しかし、私はこれをやり遂げる方法を開始する方法がわかりません。各ファイルには640x480バイトが含まれています。各ピクセルは8ビットです。バイナリデータを読み込み、unsigned char(C++)にキャストする方法

ここではC++のヘルプページを使用しています:http://www.cplusplus.com/doc/tutorial/files/しかし、私はデータを書き出しているときに、同じバイナリ/人間以外の読み込み可能な文字を表示しているようです。誰か助言してもらえますか?ここに私のコードは、これまでのところです:ここでは

#include <iostream> 
    #include <fstream> 
    using namespace std; 

ifstream::pos_type size; 
char * memblock; 

int main() { 
    ifstream file ("imageData.raw", 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); 

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

    for (int l=0; l<size; l++){ 
    cout << " memblock[] is = " << (unsigned char)memblock[l] << " index was l = " << l << endl; 
    } 

    file.close(); 


    delete[] memblock; 
    } 
    else cout << "Unable to open file"; 
    return 0; 
} 

は、出力のサンプルキャプチャです:

memblock[] is = ▀ index was l = 2937 
memblock[] is = E index was l = 2938 
memblock[] is = τ index was l = 2939 
memblock[] is = C index was l = 2940 
memblock[] is = ┘ index was l = 2941 
memblock[] is = B index was l = 2942 
memblock[] is = ╬ index was l = 2943 
memblock[] is = D index was l = 2944 
memblock[] is = ┼ index was l = 2945 
memblock[] is = C index was l = 2946 
memblock[] is = ╝ index was l = 2947 
memblock[] is = B index was l = 2948 
memblock[] is = ┤ index was l = 2949 
memblock[] is = B index was l = 2950 
memblock[] is = ¿ index was l = 2951 
memblock[] is = > index was l = 2952 
memblock[] is = í index was l = 2953 
memblock[] is = ; index was l = 2954 
memblock[] is = £ index was l = 2955 
memblock[] is = 6 index was l = 2956 
memblock[] is = á index was l = 2957 
memblock[] is = 4 index was l = 2958 
memblock[] is = Ñ index was l = 2959 
memblock[] is = 7 index was l = 2960 
memblock[] is = ╡ index was l = 2961 

答えて

8
unsigned char* memblock; // change declaration of memblock 

... 

memblock = new unsigned char[size]; // change to unsigned char 
file.seekg (0, ios::beg); 
file.read ((char*)memblock, size); // cast to a char* to give to file.read 

数値の代わりに文字を印刷するには、印刷前intにキャスト。

(int) memblock[l] 
+0

Hmm、MathWizzは、代わりにintを返します。私はそれを符号なしの文字(0から255)に変換したい。それを行う方法はありますか?それをintに変換する必要がありますか? – c0d3rz

+0

期待される出力は何ですか?数値のみを出力するようにキャストしていますか? – trumank

+0

いいえ、私は無署名の文字を扱いたいと思います。私はバイナリで保存された生のイメージを取得します。私はその読み込み不可能なフォーマットを扱うことで頭を包むことができないので、何が起こっているかを見ることができるように、無署名の文字で作業したい。私は今のところデバッグのためだけにキャストしていました。しかし、私はmemblockが基本的にそれらの値をすべてunsigned charsに変換したいと思っています。 – c0d3rz