c++ - 从字节到十六进制的令人困惑的基数转换

标签 c++ qt pointers

我在使用这段代码时遇到了一些问题。 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/

相关文章:

c - 创建 connect 4 board c 程序时出现段错误

c++ - 从位域获取完整值

c++ - 如何制作一个 CRect 对象数组?

c++ - Qt - QCheckBox 不发出 stateChanged(int state) 信号

c++ - QPolarChart隐藏径向刻度标签

qt - 在 C++ 中创建 QML 元素?

pointers - D:std.container.BinaryHeap 的奇怪行为与自定义函数进行比较

c++ - LLVM 别名分析器奇怪的结果

c++ - 如何声明已在类中声明的 char 变量的 Char 数组?

使用 stringstream 的 C++ String 到 double 转换给出精度错误