Копирование картинки (.tga) из текстового контента - PullRequest
0 голосов
/ 27 января 2019

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

Итак, я пытаюсь скопировать файл .tga из содержимого исходного файла.Точнее, я читаю файл .tga как текст и пишу его.Eventhough Notepad ++ находит оригинальный файл и новый файл как идентичные, новый файл не может быть открыт как файл .tga.Windows определяет размер файлов со смещением в 1 байт.

Можете ли вы объяснить, что я делаю неправильно?Или, может быть, предложите мне лучший способ скрыть мои файлы.

С уважением

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Я пытался читать / писать с помощью моей программы (c ++) файл .tga в виде двоичного файла, но созданный файл все еще был поврежден.Код ниже.

std::string name = "my_picture.tga";
std::ifstream FileIn(name, std::ios_base::binary);
std::vector<char> listChar;
bool stopp = false;
if (FileIn) {
    while (!(stopp))
    {
        char xin;
        FileIn.read(reinterpret_cast<char*>(&xin), sizeof(char));
        listChar.push_back(xin);
        if (FileIn.eof()) stopp = true;
    }
    FileIn.close();
}

std::ofstream FileOut(".\\test.tga", std::ios_base::binary);
bool isCarierReturn = false;
for (char xout : listChar) {
    isCarierReturn = xout == '\r';
    if (!isCarierReturn) FileOut.write(reinterpret_cast<const char*>(&xout), sizeof(char));
}
FileOut.close();

Я сравнил исходный файл с новым в шестнадцатеричном считывателе, и файлы фактически отличаются.

Разница между исходным и новым файлом состоит в несоответствии строк, заканчивающихся вместо того, чтобы просто иметь 0x0A ('\ n') в исходном файле, новый файл имел последовательность байтов 0x0D 0x0A ('\ r' и н').На некоторых других изображениях сгенерированный файл был неполным, разрыв всегда предшествует значению 0x1A (как сказал @Christoph Lipka).

Мне удается написать правильную последовательность, проверив, является ли char возвращением носителя,В этом случае char не записывается и пропускается только байт 0x0D, см. ниже:

std::ofstream FileOut(".\\test.tga", std::ios_base::binary);
bool isCarrierReturn = false;
char xout_p1 = '\0';
if (listChar.size() >= 1) xout_p1 = listChar.at(0);
for (unsigned i(0); i < listChar.size(); i++) {
    char xout = xout_p1;
    if (i < listChar.size() - 1) xout_p1 = listChar.at(i + 1);
    else xout_p1 = '\0';
    isCarrierReturn = xout == '\r' && xout_p1 == '\n';
    if (!isCarrierReturn) FileOut.write(reinterpret_cast<const char*>(&xout), sizeof(char));
}
FileOut.close();

Неполное чтение файла решается чтением файла как двоичного файла.

Это работает.

0 голосов
/ 27 января 2019

Точнее, я читаю файл .tga как текст и записываю его

В этом может заключаться ваша проблема: вы должны прочитать и написатьФайл .tga в виде двоичного файла.В противном случае любое вхождение последовательности байтов 0x0D 0x0A (CR LF, конец строки Windows) может быть заменено одним 0x0A (LF, конец строки Unix) или наоборот, или 0x1A (конец файла DOS) может быть удален или добавлен.В зависимости от кода, который вы используете, вы также можете удалить 0x00 (NUL) байтов.

...