2016-02-03 2 views
0

Я хочу прочитать любой файл (.bin, .txt, .jpg, .zip, .mp3 и т. Д.) Byte by byte (или побитно) и отобразить его на консоли (в формате, таком как 00100011). На сайте есть несколько вопросов, но в основном это файлы .bin. Не имеет значения, с каким файлом я работаю. Например, когда вы открываете файл .png в текстовом редакторе, вы видите странные символы на экране, такие как «ΣP®pT ™ 5à *», и я предполагаю, что это каждые 8 ​​бит файла, превращенного в буквы ASCII и отображаемые на редактор (пожалуйста, поправьте меня, если я ошибаюсь).Чтение любого файла (не. Бинового файла) byte by byte

Я пишу эту программу в C++ и до сих пор я пытался

fstream file("foo.txt", ios_base::binary);

прочитать файл в двоичном режиме и получить 8 битые куски, но это работает только для файлов .txt и просто отображает символы в текстовом файле, как обычно. Однако даже не работает или не открывает другие форматы файлов, например .png.

Могу ли я получить некоторые подсказки о том, как я могу это достичь, и, пожалуйста, исправьте меня, если я дам неверную информацию.

+2

Расширение файла не имеет никакого отношения к тому, как вы читаете файл! ** Все ** файлы - это просто байты. Какая у вас проблема, когда вы пытаетесь использовать свой код в PNG-файле? – immibis

+0

Я поместил байты в символ, и когда я хочу его вывести, он не отображается на экране, и я не хочу, чтобы он преобразовывался в символ. Например, текстовый файл с буквой A на нем должен давать 0x41 -> двоичный код, конечно – Orkun

+0

Чтение блока байтов часто более эффективно, чем чтение байта по байту. Для каждого вызова функции есть накладные расходы. Поэтому чтение 1024 байта с одним вызовом функции более эффективно, чем 1024 вызова функций для чтения одного байта. –

ответ

0

Возможно, вы присвоите значения типу данных «char». Вы всегда должны использовать неподписанные типы («unsigned char» должен быть достаточным для вашего случая), потому что для двоичных файлов нет отрицательных значений, и вы сможете читать 0-255 вместо 0-127 (текстовые символы). Затем, если вы хотите, чтобы он отображался в двоичном формате, вы можете использовать это:

unsigned char c = 251; 
char binary[8]; 
itoa(c, binary, 2); 
cout << binary << endl; 
+0

Дело в том, что я работаю с «ifstream», а функция read получает указатель на массив символов как один вход, и я должен хранить его в символе. Что вы скажете об этом. – Orkun

2

Проблема заключается в том, что возможна только часть значений в байте. Например, значение 0x03 не может быть распечатано, но 0x42.

Я рекомендую вам отличить переменную от uint8_t до unsigned int перед печатью. Что-то вроде cout << hex << (unsigned int)(value) << endl;

Кроме того, не используйте char, signed char или unsigned char при чтении двоичных файлов. Использовать uint8_t, uint16_t или uint32_t.

Смежные вопросы