Изучение вывода необработанных файлов C ++ - PullRequest
0 голосов
/ 10 декабря 2011

Привет, я читаю в двоичном файле в формате hex.Это файл изображения, приведенный ниже, является кратким примером первых нескольких строк кода с использованием команды hd ... | more в linux.Изображение является бинарным изображением, поэтому цвета только в пикселях: черный или белый.Это изображение размером 1024 на 1024, однако его размер составляет 2097152 байта

00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ... ................ |

000dfbf0 00 00 00 00 00 00 00 00 00 00 00 00 ff 00 ff 00 | ................ |

000dfc00 ff 00 ff 00 ff 00 00 00 00 00 00 00 00 00 00 00 | ................ |

000dfc10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................ |

Это код, который я использую для чтения, найденный в другом потоке на SO

ifstream file (argv[1], ios::in | ios::binary | ios::ate);
ifstream::pos_type fileSize;
char* fileContents;
if(file.is_open())
{
    fileSize = file.tellg();
    fileContents = new char[fileSize];
    file.seekg(0, ios::beg);
    if(!file.read(fileContents, fileSize))
    {
        cout << "fail to read" << endl;
    }
 file.close();
 cout << fileSize << endl;

Однако код работает, когда я запускаю его для цикла

for (i=0; i<2097152; i++)
 printf("%hd",fileContents[i]);

Единственное, что распечатано, это нули, а не 1.Почему это мои параметры в printf, неправильно указывающие размер пикселя.Я точно знаю, что на изображении есть 1, представляющие белые области.Также, как мне определить, сколько байтов представляет пиксель на этом изображении.

Ответы [ 2 ]

1 голос
/ 10 декабря 2011

Ваш printf() не так.%hd означает short, а fileContents[i] - char;на всех современных системах, с которыми я знаком, это несоответствие размеров.Вместо этого используйте массив short, поскольку у вас в два раза больше байтов, чем в пикселях.

Кроме того, прекратите использовать printf() и используйте std::cout, чтобы избежать проблем с несовпадением типов.

0 голосов
/ 10 декабря 2011

Поскольку 2097152/1024 - это ровно 2048, а это, в свою очередь, 2 * 1024, я бы предположил, что каждый пиксель составляет 2 байта.

Другая проблема, вероятно, связана с printf.Я не уверен, что такое %hd, я бы сам использовал %02x и преобразовал бы данные в int.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...