Самый простой способ - это, вероятно, создать std::bitset
из входных данных и распечатать их. Не обращая внимания на проверку ошибок и прочее, простая версия будет выглядеть примерно так:
#include <bitset>
#include <fstream>
#include <iostream>
#include <ios>
#include <iomanip>
int main(int argc, char **argv) {
std::ifstream infile(argv[1], std::ios::binary);
char ch;
unsigned long count = 0;
while (infile.read(&ch, 1)) {
if (count++ % 4 == 0)
std::cout << "\n" << std::setw(6) << std::hex << count;
std::cout << std::setw(10) << std::bitset<8>(ch);
}
return 0;
}
Я бы посчитал, что нормальный дамп в шестнадцатеричном формате намного удобнее для использования. Я показываю только четыре байта на строку выше (8 поместится в 80 столбцах, только если пропустить смещение в начале строки, что будет серьезной потерей, по крайней мере, по моему опыту), поэтому весь экран обычно будет всего ~ 200 байтов или около того. В шестнадцатеричном формате вы можете (и обычно делаете) отображать 16 байтов на строку, как в шестнадцатеричном, так и (для печатных символов), а также сами по себе.
Я должен добавить, однако, что я использую шестнадцатеричные дампы вот уже несколько десятилетий, поэтому мое мнение может основываться хотя бы частично на предвзятости, а не на реальных фактах.