#include #include #include #include #include constexpr unsigned line_width = 16; int hexdump_main(int argc, char** argv) { std::ios::sync_with_stdio(false); std::ifstream file; std::istream& input = [&]() -> std::istream& { if (argc <= 1) { return std::cin; } else { file.open(argv[1], std::ios::binary); return file; } }(); std::array raw{}; std::streamsize filepos = 0; while (input) { input.read(raw.data(), raw.size()); auto count = input.gcount(); if (count == 0) { break; } std::cout << std::hex << std::setw(8) << std::setfill('0') << filepos << " "; filepos += count; for (std::streamsize i = 0; i != count; ++i) { if (i == line_width / 2) { std::cout << ' '; } auto ch = static_cast(raw[static_cast(i)]); std::cout << std::hex << std::setw(2) << +ch << ' '; } for (std::streamsize i = count; i != line_width; ++i) { if (i == line_width / 2) { std::cout << ' '; } std::cout << " "; } std::cout << " |"; for (std::streamsize i = 0; i != count; ++i) { auto ch = raw[static_cast(i)]; if (std::isprint(ch) || ch == ' ') { std::cout << ch; } else { std::cout << '.'; } } std::cout << "|\n"; } std::cout << std::hex << std::setw(8) << std::setfill('0') << filepos << '\n'; return 0; }