2012-06-26 10 views
5

Tengo un archivo de imagen sin formato que se guarda en datos binarios (sin codificación). Quiero leer en el archivo y convertir los valores a un char sin signo. Pero no estoy seguro de cómo empezar a hacer esto. Cada archivo contiene 640x480 bytes. Cada píxel es de 8bits.Cómo leer datos binarios y convertirlos en caracteres sin signo (C++)

He utilizado la página de ayuda de C++ aquí: http://www.cplusplus.com/doc/tutorial/files/, sin embargo, cuando estoy couting los datos, parece mostrar los mismos caracteres binarios/no legibles por humanos. ¿Puede alguien por favor asesorar? Aquí está mi código hasta ahora:

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

Aquí se muestra una captura de la salida:

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 

Respuesta

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 

Para imprimir los valores numéricos en lugar de caracteres, emitidos a un int antes de imprimir.

(int) memblock[l] 
+0

Hmm, MathWizz, eso me da una int en su lugar. Quiero convertirlo en un carácter sin signo (0 a 255). ¿No hay forma de hacerlo? ¿Necesito convertirlo solo a int? – c0d3rz

+0

¿Cuál es el resultado esperado? ¿Solo estás lanzando para imprimir un valor numérico? – trumank

+0

No, quiero tratar con caracteres sin firmar. Obtengo imágenes en bruto que se guardan en binario. Simplemente no puedo entender el formato no legible, por lo que quiero trabajar con caracteres sin signo solo para poder ver lo que está sucediendo. Solo estaba buscando depuración por ahora. Pero quiero que el memblock esencialmente convierta todos esos valores a caracteres sin signo en su lugar ... – c0d3rz

Cuestiones relacionadas