从文本内容复制图片(.tga)

时间:2019-01-27 18:13:53

标签: c++ tga

我致力于游戏的创作。我想隐藏我的所有.tga文件。 我将所有文件的字符串内容串联在一个文件中,以使播放器无法识别。 我希望我的程序通过从创建临时文件.tga文件来加载图片 保存的内容。

因此,我正在尝试从原始文件的内容中复制一个.tga文件。 更准确地说,我将.tga文件作为文本读取并写入。 尽管Notepad ++发现原始文件和新文件相同,但新文件无法以.tga文件打开。 Windows检测到具有1个字节偏移的文件大小。

您能解释一下我在做什么错吗? 或者可以建议我一种更好的隐藏文件的方式。

致谢

2 个答案:

答案 0 :(得分:0)

  

更准确地说,我读取.tga文件为文本,然后将其写入

这可能是您的问题所在:您必须将.tga文件读取和写入为二进制文件。否则,任何出现的字节序列0x0D 0x0A(CR LF,Windows行末尾)都可以替换为单个0x0A(LF,Unix行末尾),反之亦然,或者可以剥离或附加0x1A(文件的DOS末尾)。根据所使用的代码,最终还可能会剥离所有0x00(NUL)字节。

答案 1 :(得分:0)

我试图用程序(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();

我在十六进制阅读器上比较了原始文件和新文件,并且文件实际上是不同的。

原始文件与新文件之间的区别在于,结尾处的行不匹配,新文件的字节序列为0x0D 0x0A('\ r'和' \ n')。在其他一些图片上,生成的文件不完整,中断总是在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();

通过将文件读取为二进制文件来解决文件读取不完全的问题。

有效。