How to read in binary data and cast to unsigned char (C++)

12,045
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

To print numeric values instead of characters, cast to an int before printing.

(int) memblock[l]
Share:
12,045
c0d3rz
Author by

c0d3rz

Updated on June 24, 2022

Comments

  • c0d3rz
    c0d3rz almost 2 years

    I have a raw image file that is saved in binary data (no encoding). I want to read in the file and cast the values to an unsigned char. But I'm not sure how to begin going about doing this. Each file contains 640x480 bytes. Each pixel is 8bits.

    I've used the C++ help page here: http://www.cplusplus.com/doc/tutorial/files/, however when I am couting the data, it seems to be showing the same binary/non-human readable characters. Can someone please advise? Here is my code so far:

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

    Here is a sample capture of the 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