C ++: Как добавить необработанные двоичные данные в источник с помощью Visual Studio? - PullRequest
13 голосов
/ 19 апреля 2011

У меня есть двоичный файл, который я хочу встроить непосредственно в мой исходный код, поэтому он будет скомпилирован в файл .exe напрямую, а не читается из файла, поэтому данные уже будут в памяти, когда я запустите программу.

Как мне это сделать?

Единственная идея, которую я получил, состояла в том, чтобы закодировать мои двоичные данные в base64, поместить их в строковую переменную и затем декодировать обратно в необработанные двоичные данные, но это хитрый метод, который приведет к бессмысленному распределению памяти. Кроме того, я хотел бы хранить данные в .exe, столь же компактном, как исходные данные.

Редактировать: Причина, по которой я думал об использовании base64, заключалась в том, что я тоже хотел сделать файлы исходного кода как можно меньше.

Ответы [ 4 ]

10 голосов
/ 19 апреля 2011

Самый простой и удобный способ - написать небольшой программа, которая преобразует данные в источник C ++, затем компилирует это и связать это в вашей программе. Этот сгенерированный файл может выглядеть примерно так:

unsigned char rawData[] =
{
    0x12, 0x34, // ...
};
5 голосов
/ 19 апреля 2011

Для этого есть инструменты, типичное имя - «bin2c». Первый результат поиска: эта страница .

Вам необходимо создать массив char, а также, желательно, сделать его static const.

В С:

Может потребоваться некоторая осторожность, поскольку у вас не может быть литерала типа char, а также потому, что обычно подпись типа C char зависит от реализации.

Возможно, вы захотите использовать такой формат, как

static const unsigned char my_data[] = { (unsigned char) 0xfeu, (unsigned char) 0xabu, /* ... */ };

Обратите внимание, что каждый литерал unsigned int приводится к unsigned char, а также суффикс 'u', который делает их беззнаковыми.

Так как этот вопрос был для C ++, где вы можете иметь литерал char, вы можете вместо этого использовать такой формат:

static const char my_data[] = { '\xfe', '\xab', /* ... */ };

, поскольку это всего лишь массив символов char, вы также можете использовать обычный синтаксис строкового литерала. Встраивание нулевых байтов должно быть в порядке, если вы не пытаетесь рассматривать его как строку:

static const char my_data[] = "\xfe\xdab ...";

Это самое компактное решение. На самом деле, вы могли бы использовать это и для Си.

3 голосов
/ 19 апреля 2011

Вы можете использовать файлы ресурсов (.rc). Иногда они плохие, но для приложений на базе Windows это обычный способ.

0 голосов
/ 19 апреля 2011

Почему base64?Просто сохраните файл как есть в одном char*.

...