Как читать двоичные данные и приводить к беззнаковому символу (С++)

У меня есть необработанный файл изображения, который сохраняется в двоичных данных (без кодировки). Я хочу прочитать файл и привести значения к беззнаковому символу. Но я не уверен, как начать делать это. Каждый файл содержит 640x480 байт. Каждый пиксель 8 бит.

Я использовал страницу справки 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

person c0d3rz    schedule 26.06.2012    source источник


Ответы (1)


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]
person trumank    schedule 26.06.2012
comment
Хм, MathWizz вместо этого дает мне int. Я хочу преобразовать его в беззнаковый символ (от 0 до 255). Нет ли способа сделать это? Нужно ли мне преобразовать его только в int? - person c0d3rz; 26.06.2012
comment
Каков ожидаемый результат? Вы только печатаете числовое значение? - person trumank; 26.06.2012
comment
Нет, я хочу иметь дело с беззнаковыми символами. Я получаю необработанные изображения, которые сохраняются в двоичном формате. Я просто не могу разобраться с этим нечитаемым форматом, поэтому я хочу работать с неподписанными символами, чтобы видеть, что происходит. Я пока только отлаживал для отладки. Но я хочу, чтобы мемблок по существу преобразовывал все эти значения в символы без знака... - person c0d3rz; 26.06.2012
comment
Итак, вы хотите преобразовать memblock в unsigned char*? - person trumank; 26.06.2012
comment
Проблема в том, что file.read ожидает char в качестве входного параметра1: istream& read ( char* s, streamsize n ); (cplusplus.com/reference/iostream/istream/read), поэтому Я столкнусь с ошибками компиляции... - person c0d3rz; 26.06.2012
comment
Спасибо MathWiz! Всего один вопрос, так что если он читает его как char (как вы указали). Это просто обрезает другие биты? Как это работает? - person c0d3rz; 27.06.2012
comment
@ c0d3rz Любой тип, не являющийся беззнаковым, поджигается. Он имеет тот же диапазон данных, но половина отрицательна, поэтому saled char имеет диапазон от -128 до 127. Подробнее здесь: en.wikipedia.org/wiki/Integer_(computer_science) - person trumank; 27.06.2012
comment
О, я знаю разницу между неподписанным и подписанным. Я хотел спросить, когда мы читаем файл: file.read ((char*)memblock, size); , мы читаем его как char. Но структура мемблока определяется как тип unsigned char. Итак, я думаю, что все, что было -128, становится 0. А все, что было 127, становится 255? - person c0d3rz; 27.06.2012
comment
Только один последний вопрос. Что если я не завершу программу командой delete[] memblock; Каковы последствия? - person c0d3rz; 27.06.2012
comment
@ c0d3rz Я не уверен в этом на 100%, но думаю, что вся используемая память освобождается при выходе. Источник: cplusplus.com/forum/general/11808/#msg55971 - person trumank; 27.06.2012
comment
:) В следующий раз, когда у вас возникнут подобные вопросы, подумайте о том, чтобы перейти в чат. Это действительно не место для этого. - person trumank; 27.06.2012