Преобразование двоичных данных, прочитанных из файла, в указатель на char в c ++ - PullRequest
1 голос
/ 04 августа 2020

Я пытаюсь добиться непрерывного преобразования двоичного содержимого, считанного из файла, в байт. Мой файл samplefile.bin содержит 16 байт , и он имеет двоичную форму. В Hexed.it это будет выглядеть так.

C ++ читает двоичный файл и конвертирует в шестнадцатеричный и Конвертирует двоичный файл в шестнадцатеричную нотацию . Я не нашел точного решения, потому что в этих двух ссылках они конвертируют его в строку. Мое намерение не в этом.

Я упоминал об этом Как правильно читать данные из двоичного файла в массив символов , который похож на мой. Но это не решило мою проблему. Я хочу, чтобы этот 0xCC был одним байтом, и он должен быть сохранен в ptr[0] и аналогичным образом для других значений

Как обойти эту проблему? Я что-то упустил? Я новичок ie в C ++, и, пожалуйста, помогите мне решить эту проблему

С признательностью

Ответы [ 2 ]

1 голос
/ 04 августа 2020

В вашем коде есть несколько проблем, в основном это тот факт, что вы, кажется, ожидаете, что 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";
}
1 голос
/ 04 августа 2020

Прочитать файл и скопировать его данные в вектор символа. Вы можете использовать iomanip, например std :: hex или std :: uppercase, для печати целочисленного значения в шестнадцатеричном формате.

Выделение и передача необработанного указателя другой функции не рекомендуется. Просто передайте вектор char или используйте unique_ptr, они избавят вас от проблем с памятью.

#include <iostream>
#include <iomanip>

std::ifstream file("samplefile.bin", ios::binary);
auto mem = std::vector<char>(std::istreambuf_iterator<char>(file), std::istreambuf_iterator<char>());
for (char c : mem)
{
    std::cout << std::uppercase << std::hex << static_cast<int>(c) << endl;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...