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

Copying picture (.tga) from text content

本文关键字:tga 复制 文本      更新时间:2023-10-16

我正在创作一款游戏。我想隐藏我所有的.tga文件。我将所有文件的字符串内容连接在一个文件中,以便玩家无法使用。我希望我的程序通过从中创建临时.tga文件来加载图片保存的内容。

因此,我正在尝试从原始文件的内容中复制.tga文件。更准确地说,我将.tga文件读取为文本并写入它。即使 Notepad++ 发现原始文件和新文件相同,新文件也不能作为.tga文件打开。Windows 检测偏移量为 1 字节的文件大小。

你能解释一下我做错了什么吗?或者可能会建议我一种更好的方法来隐藏我的文件。

问候

更准确地说,我将.tga文件读取为文本并写入它

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

我尝试用我的程序(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(""),新文件具有字节序列0x0D 0x0A("\r"和"")。在其他一些图片上,生成的文件不完整,中断总是在0x1A值之前(如 Lipka @Christoph所述)。

我设法通过测试字符是否是载体返回来编写正确的序列,在这种情况下没有写入字符,并且仅跳过字节0x0D,请参见下文:

std::ofstream FileOut(".\test.tga", std::ios_base::binary);
bool isCarrierReturn = false;
char xout_p1 = '';
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 = '';
    isCarrierReturn = xout == 'r' && xout_p1 == 'n';
    if (!isCarrierReturn) FileOut.write(reinterpret_cast<const char*>(&xout), sizeof(char));
}
FileOut.close();

通过将文件作为二进制文件读取来解决不完整的文件读取。

它有效。