这在主要部分:
std::ofstream rainbow_file("rainbow.bin", std::ios::binary);
rainbow_file.write((const char*) p.pass, password::PASSWORD_SIZE);
rainbow_file.write((const char*) h.hash_, hash::HASH_SIZE);
哪里:
class hash
{
public:
static const size_t HASH_SIZE = 32;
uint8_t hash_[HASH_SIZE];
...
}
// similar for pass
我在 Notepad++ 中打开 Rainbow.bin 文件,看到我的通行证为通行证(字符 A-Z、@、!、a-z、0-9)以及哈希值的二进制垃圾。稍后我会这样做:
std::ifstream rainbow_file("rainbow.bin", std::ios::binary);
rainbow_file.read((char*) p.pass, password::PASSWORD_SIZE);
rainbow_file.read((char*) h.hash_, hash::HASH_SIZE);
我将通行证作为二进制垃圾返回。我尝试了很多事情(比如打开两个流 - 一个不是二进制模式 - 并使用eekg单独移动文件指针,尝试各种转换等),但在我的一生中,我无法让它工作。我很好奇为什么。并感到沮丧。我在 npp 中重复一遍,我看到所有事情都按顺序排列。
编辑:这些是不同的控制流,并且流已正确关闭()
编辑2:有效!仍请参阅下面的答案和评论,了解更多 C++ 方法
最佳答案
std::ifstream rainbow_file("rainbow.bin", std::ios::binary); /* OK */
rainbow_file.read((char*) p.pass, password::PASSWORD_SIZE); /* KO */
rainbow_file.read((char*) h.hash_, hash::HASH_SIZE);
应替换为:
rainbow_file.read ( reinterpret_cast < char*> (&(p.pass)), password::PASSWORD_SIZE * sizeof(uint_8t));
rainbow_file.read ( reinterpret_cast < char*> (&(h.hash_)), hash::HASH_SIZE * sizeof(uint_8t));
这样您就不会假设 sizeof ( uint_8t ) == sizeof (char)。
在 C++ 中,h.hash_ 是 uint_8t(&)[hash::HASH_SIZE] 类型的数组,而不是指针...您可以通过让编译器检查强制转换来轻松发现问题,但不幸的是,您已经使用 C 风格的强制转换,未检查。
切勿在 C++ 程序中使用 C 风格的转换方法!!!
但事实上你可以像纯 C++ 那样完成它,不会出现错误:
std::ifstream rainbow_file("rainbow.bin", std::ios::binary);
rainbow_file >> p.pass >> h.hash_;
关于c++ - ascii 和二进制 - 按应有的方式显示,但读取返回垃圾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10778198/