[C\C++] File to byte array

Эксперт
Статус
Оффлайн
Регистрация
12 Июн 2014
Сообщения
991
Реакции[?]
1,209
Поинты[?]
3K
Вновь изобретенный велосипед, но пришлось писать....

перегоняет указанный файл в массив байт. просто, быстро, красиво....
Код:
#include <iostream>
#include <sstream>
#include <Windows.h>
#include <fstream>
#include <iomanip>
#include <cctype>
#include <experimental/filesystem>

namespace fs = std::experimental::filesystem;

bool GenerateCode(std::string file)
{
    const fs::path FilePath = file;
    std::ifstream GenerateFile(FilePath, std::ios::binary);
    if (GenerateFile.fail()) {
        std::cout << "Не удалось открыть  фаил!" << std::endl;
        return false;
    }
    std::cout << "Open file: " << FilePath << "\n" << std::endl;

    GenerateFile.seekg(0, std::ios_base::end);
    size_t sizeFile = GenerateFile.tellg();
    std::cout << "Size: " << sizeFile << std::endl;
    GenerateFile.seekg(0, GenerateFile.beg);

    std::string szNameFile = FilePath.stem().string();
    std::string szOutFile = szNameFile.append(".h");
    std::cout << "Out File: " << szOutFile << std::endl;

    std::ofstream StreamOut(szOutFile, std::ios::trunc);
    if (StreamOut.fail()) {
        std::cout << "Не удалось создать фаил!" << std::endl;
        return false;
    }

    std::string szNameArarry = FilePath.stem().string();
    szNameArarry.erase(std::remove_if(szNameArarry.begin(), szNameArarry.end(),
        [](auto const& c) -> bool
    {
        return !std::isalnum(c);
    }),
        szNameArarry.end());

    StreamOut << "//GenerateCode by  Крайслер, 2018\n\n//File size: " << sizeFile << std::endl;
    StreamOut << "unsigned char " << szNameArarry << "[] =" << std::endl;
    StreamOut << "{" << std::endl;
    StreamOut << "\t";

    std::stringstream ss;
    ss << std::hex << std::uppercase << std::setfill('0');
    const char* separator = "";
    int col = 0;

    auto it = std::istreambuf_iterator<char>(GenerateFile);
    auto eof = std::istreambuf_iterator<char>();
    while (!it.equal(eof)) {
        unsigned int c = *it++ & 0xFF;
        ss << separator << "0x" << std::setw(2) << c;
        separator = ", ";
        if (++col % 16 == 0) {
            if (it != eof) {
                ss << "," << std::endl;
                ss << "\t";
                separator = "";
            }
        }
    }

    StreamOut << ss.str();
    StreamOut << std::endl;
    StreamOut << "};" << std::endl;

    GenerateFile.close();
    StreamOut.close();
}
на выходе получаем .h фаил с тем же названием что и исходный файл с примерно таким содержимым:
Код:
//GenerateCode by  Крайслер, 2018
//File size: 223233
unsigned char PicPng[] =
{
    0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52,
    0x00, 0x00, 0x02, 0xA0, 0x00, 0x00, 0x01, 0x05, 0x08, 0x06, 0x00, 0x00, 0x00, 0x3C, 0x05, 0x55,
    0x05, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52, 0x47, 0x42, 0x01, 0xD9, 0xC9, 0x2C, 0x7F, 0x00, 0x00,
    0x00, 0x20, 0x63, 0x48, 0x52, 0x4D, 0x00, 0x00, 0x7A, 0x26, 0x00, 0x00, 0x80, 0x84, 0x00, 0x00,
   
    ....................
   
    0xEE, 0xFA, 0x21, 0xDF, 0xE3, 0xCD, 0x3F, 0x5F, 0xE1, 0x04, 0xEF, 0x0B, 0x77, 0x58, 0x11, 0xDF,
    0xAF, 0x99, 0xD7, 0xC6, 0x08, 0xEC, 0xD1, 0xA3, 0xC7, 0x3D, 0x8C, 0xFF, 0x1F, 0xC4, 0x7A, 0x58,
    0xD5, 0x06, 0x4C, 0x0A, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60,
    0x82
};
Имя массива принимает имя файла, но с удалением всех спец символов и символов табуляции(курим std::isalnum())
зы: С++17


Готовая программа:
Пожалуйста, авторизуйтесь для просмотра ссылки.

Пожалуйста, авторизуйтесь для просмотра ссылки.
 
Последнее редактирование:
Разработчик
Статус
Оффлайн
Регистрация
23 Авг 2017
Сообщения
171
Реакции[?]
474
Поинты[?]
1K
А разве хекс редакторы (тот же HxD) этого делать не умеют? :thinking:
Ну хотя там сам сказал что это велосипед, так что всё норм :roflanEbalo:
 
Эксперт
Статус
Оффлайн
Регистрация
12 Июн 2014
Сообщения
991
Реакции[?]
1,209
Поинты[?]
3K
А разве хекс редакторы (тот же HxD) этого делать не умеют? :thinking:
Ну хотя там сам сказал что это велосипед, так что всё норм :roflanEbalo:
умеют))) но мне нужно было перегнать 134 файла в массивы, а делать это через Hex-редакторы было бы очень долго.
Да и проще же просто перетащить файл на программу и получить полностью готовый вариант без лишних телодвижений
 
HVHLEGEND
Забаненный
Статус
Оффлайн
Регистрация
13 Май 2018
Сообщения
745
Реакции[?]
121
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
я дико извиняюсь за апп темы. мб кому та еще это прога пригодится ))
вообщем запускаю прогу открывается консоль и сразу закрывается, че за хуйня ?
 
Эксперт
Статус
Оффлайн
Регистрация
12 Июн 2014
Сообщения
991
Реакции[?]
1,209
Поинты[?]
3K
я дико извиняюсь за апп темы. мб кому та еще это прога пригодится ))
вообщем запускаю прогу открывается консоль и сразу закрывается, че за хуйня ?
просто перетащи фаил на программу(на значок)
 
Сверху Снизу