2012-06-26 14 views
5

Ho un file immagine raw che viene salvato in dati binari (nessuna codifica). Voglio leggere nel file e trasmettere i valori a un carattere non firmato. Ma non sono sicuro di come iniziare a fare questo. Ogni file contiene 640x480 byte. Ogni pixel è 8 bit.Come leggere i dati binari e il cast in unsigned char (C++)

Ho usato la pagina di aiuto C++ qui: http://www.cplusplus.com/doc/tutorial/files/, tuttavia quando sto couting i dati, sembra che stia mostrando gli stessi caratteri binari/non umani leggibili. Qualcuno può consigliare? Ecco il mio codice finora:

#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; 
} 

Qui è una cattura esempio dell'output:

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 

risposta

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 

Per stampare i valori numerici al posto dei caratteri, espressi a un int prima della stampa.

(int) memblock[l] 
+0

Hmm, MathWizz, che mi dà invece un int. Voglio convertirlo in un carattere senza segno (da 0 a 255). Non c'è modo di farlo? Devo convertirlo in un solo int? – c0d3rz

+0

Qual è l'uscita prevista? Stai solo lanciando per stampare un valore numerico? – trumank

+0

No, voglio occuparmi di caratteri non firmati. Ottengo immagini non elaborate che vengono salvate in binario. Non riesco a spiegarmi come gestire questo formato non leggibile, quindi voglio lavorare con caratteri non firmati solo per vedere cosa sta succedendo. Per il momento stavo solo eseguendo il debugging. Ma voglio che il memblock converta essenzialmente tutti quei valori in caratteri non firmati ... – c0d3rz

Problemi correlati