В вашем коде есть несколько проблем, в основном это тот факт, что вы, кажется, ожидаете, что std::byte8_t
по умолчанию будет представлен как шестнадцатеричный дамп при подаче в выходной поток. Это не вариант. Вам нужно явно указать потоку выполнить необходимое форматирование за вас. И если вы хотите сохранить это представление, вам также необходимо сохранить потоковый результат.
Многие дороги ведут в Рим, и, к сожалению, стандартная библиотека потоков ввода-вывода C ++ не поддерживает работа с байтовыми потоками очень эргономична c. Но вот один подход:
#include <cstdint>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <sstream>
#include <vector>
using byte = std::uint8_t;
auto read_bytes(std::istream& is, std::vector<byte>& bytes) -> std::istream& {
return is.read(& reinterpret_cast<char&>(bytes[0]), bytes.size());
}
auto hexdump(std::vector<byte> const& bytes) -> std::string {
auto ostr = std::ostringstream();
ostr << std::uppercase << std::hex << std::setw(2) << std::setfill('0');
for (auto const c : bytes) {
ostr << int{c};
}
return ostr.str();
}
int main(int argc, char** argv) {
if (argc != 2) return 1;
auto fs = std::ifstream(argv[1], std::ios_base::binary | std::ios_base::ate);
auto const size = fs.tellg();
fs.seekg(0);
auto buffer = std::vector<byte>(size);
if (not read_bytes(fs, buffer)) return 1;
std::cout << hexdump(buffer) << "\n";
}