2012-06-26 18 views
5

Mam surowy plik obrazu, który jest zapisywany w danych binarnych (bez kodowania). Chcę przeczytać w pliku i rzucić wartości na unsigned char. Ale nie jestem pewien, jak zacząć to robić. Każdy plik zawiera 640 x 480 bajtów. Każdy piksel ma 8 bitów.Jak odczytać dane binarne i rzutować na niepodpisany znak (C++)

Używam strony pomocy C++ tutaj: http://www.cplusplus.com/doc/tutorial/files/, jednak gdy przeglądam dane, wydaje się, że wyświetlają one te same odczytywalne znaki binarne/inne niż ludzkie. Czy ktoś może doradzić? Oto mój kod do tej pory:

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

tutaj jest przechwytywanie próba wyjścia:

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 

Odpowiedz

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 

Aby wydrukować wartości numeryczne zamiast znaków, oddanych do int przed wydrukowaniem.

(int) memblock[l] 
+0

Hmm, MathWizz, to daje mi int. Chcę przekonwertować go na unsigned char (od 0 do 255). Czy nie ma sposobu, aby to zrobić? Czy muszę przekonwertować go tylko na int? – c0d3rz

+0

Jakie są oczekiwane wyniki? Czy przesyłasz tylko w celu wydrukowania wartości liczbowej? – trumank

+0

Nie, chcę obsłużyć niepodpisane znaki. Otrzymuję surowe obrazy, które są zapisywane w formacie binarnym. Po prostu nie mogę zawinąć głowy, zajmując się tym nieczytelnym formatem, więc chcę pracować z niepodpisanymi znakami tylko po to, abym mógł zobaczyć, co się dzieje. Na razie rzucałem tylko debugowanie. Ale chcę, aby memblock zasadniczo konwertował wszystkie te wartości na niepodpisane znaki ... – c0d3rz