我在使用此代码时遇到了一些麻烦。 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方法可以让它更容易显示。
答案 0 :(得分:5)
代码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 ...
答案 1 :(得分:-1)
您实际上是将string
(作为const char*
)转换为long long*
,然后取消引用它,并将您获得的任何数值赋予{{1}的构造函数}}。不使用QByteArray
类,您就是这样做的:
qt
你得到同样的字符串吗?不,你没有。
std::string s = "1b3";
const char* cc = s.c_str();
std::cout<<cc<<std::endl;
std::cout<<*(long long*)cc<<std::endl;
这不是一个数学问题......将output:
1b3
3367473
转换为char*
并期望结果有一个有效的数值是一个问题。