我的游戏有超过 80 个关卡,只有一个关卡未通过加盐 sha1 哈希。原因是盐被添加到关卡文件中而不是末尾。
该问题仅在 Ubuntu 16.04 64 位中出现,在 Windows 中有效。它发生在每次发射并且每次都被插入到相同的位置。
关卡文件有两行,第一行是关卡文件,第二行是哈希值。所以我得到第一行并向其添加盐。但问题仍然与单行文件相同。
这是最小化的代码:
int main() {
std::ifstream inf("level.txt");
std::string lvl_file;
std::getline(inf, lvl_file);
inf.close();
lvl_file += "MYSECRETSALT"; // lvl_file.append(..) also has same issue
std::cout << lvl_file << std::endl;
}
这段代码打印了整个关卡文件,但 MYSECRETSALT 进入了它的内部,而不是它的末尾。如果我在追加之前打印 lvl_file,它会很好地打印而不会遗漏任何内容。
// IT SHOULD BE LIKE
...[0,26],[1,61]],"decor_2":[[0,25000]],"decor_3":[[0,25000]],"tiles_3":[[0,25000]]},"ghosts":[],"turrets":[]}MYSECRETSALT
// BUT IT PRINTS LIKE THIS
...[0,26],[1,61]],"decor_2":[[0,25000]],"decorMYSECRETSALT0]],"tiles_3":[[0,25000]]},"ghosts":[],"turrets":[]}
关卡文件在底部:https://hastebin.com/ayeduwucid.php
不过,将文件硬编码到字符串流中可以正常工作。
std::stringstream inf;
inf << R"json(..)json";
最佳答案
该文件是用 Windows 编写的,它转到第二行 \n
。当我以十六进制检查它时,它实际上放置了导致这些问题的 \r\n
。
关于C++ std::string 追加覆盖而不是追加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43559760/