我致力于游戏的创作。我想隐藏我的所有.tga文件。 我将所有文件的字符串内容串联在一个文件中,以使播放器无法识别。 我希望我的程序通过从创建临时文件.tga文件来加载图片 保存的内容。
因此,我正在尝试从原始文件的内容中复制一个.tga文件。 更准确地说,我将.tga文件作为文本读取并写入。 尽管Notepad ++发现原始文件和新文件相同,但新文件无法以.tga文件打开。 Windows检测到具有1个字节偏移的文件大小。
您能解释一下我在做什么错吗? 或者可以建议我一种更好的隐藏文件的方式。
致谢
答案 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();
通过将文件读取为二进制文件来解决文件读取不完全的问题。
有效。