gpt4 book ai didi

c++ - ascii 和二进制 - 正常显示但读取返回垃圾

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:55:10 26 4
gpt4 key购买 nike

这主要是:

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);

我收到的传票是二进制垃圾。我尝试了很多事情(比如打开两个流 - 一个不是二进制模式 - 并使用 seekg 单独移动文件指针,尝试各种转换等)但是对于我的生活我无法让它工作。我很好奇为什么。和沮丧。我在 npp 中重复一遍,我按顺序查看所有内容。

编辑:这些是不同的控制流,并且流已正确关闭()

Edit2:有效!仍然看到下面的答案和更多 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com