从文本内容复制图片 (.tga)
Copying picture (.tga) from text content
我正在创作一款游戏。我想隐藏我所有的.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();
通过将文件作为二进制文件读取来解决不完整的文件读取。
它有效。
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 使用strcpy将char数组的元素复制到另一个数组
- 是否可以初始化不可复制类型的成员变量(或基类)
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 复制列表初始化的隐式转换的等级是多少
- 当从函数参数中的临时值调用复制构造函数时
- 有可能在Armadillo中复制MATLAB circshift方法吗
- 复制几乎为空的数组的最快方法
- 以下示例中如何避免代码复制?C++/库达
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 不能将复制初始化与隐式转换的多个步骤一起使用
- 当有分配器意识的容器被复制/移动时,反弹分配器是否被复制/移走
- 为什么复制而不是移动数据元素?
- 文件系统:复制功能的速度秘诀是什么
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- 从文本内容复制图片 (.tga)