我在使用这段代码时遇到了一些问题。 QByteArray::number 应该从哈希中获取 QByteArray 并将其转换为十六进制,但结果比我预期的要短得多。我认为两个输出应该是相同的。我认为这与指针强制转换有关,但我不明白该强制转换做得很好,无法了解如何进行赋值。
谁能解释为什么这两行输出不同的结果?最好用数学术语。
代码
QCryptographicHash hash(QCryptographicHash::Sha1);
hash.addData("some string to hash");
qDebug() << QByteArray::number(*(qlonglong*)hash.result().data(), 16);
qDebug() << hash.result().toHex();
输出:
"89bde3ca56c83c47"
"473cc856cae3bd89e43ff9f62963d6f38372ccbd"
预期输出:
"473cc856cae3bd89e43ff9f62963d6f38372ccbd"
"473cc856cae3bd89e43ff9f62963d6f38372ccbd"
注意:我的实际问题是基于 36,而不是 16,但是有一个方便的 .toHex 方法可以使这更容易显示。
最佳答案
在您的代码中,hash.result().data()
指向 160 位(20 字节)的数据。 qlonglong
是您平台上的 64 位(8 字节)数据。
*(qlonglong*)hash.result().data()
将哈希结果的前 8 个字节重新解释为数字。您的平台是小端平台,因此哈希数据的第一个字节被解释为结果数字的低字节。
因此,64 位数字(以十六进制形式查看)以相反的顺序显示哈希数据的前 8 个字节。您可以在输出中看到:
89 bd ... 3c 47
与开头部分相反
47 3c ... bd 89 e4 3f ...
关于c++ - 从字节到十六进制的令人困惑的基数转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14667614/