混淆从字节到十六进制的基本转换

时间:2013-02-02 23:20:48

标签: 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方法可以让它更容易显示。

2 个答案:

答案 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*并期望结果有一个有效的数值是一个问题。