令人困惑的从字节到十六进制的基本转换
Confusing base conversion from bytes to hex
我在这段代码上遇到了一些问题。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"
注意:我的实际问题是在 base 36 中,而不是 16,但有一个方便的 .toHex 方法可以使其更容易显示。
在 160 位(20 字节)数据上编码hash.result().data()
点。qlonglong
是平台上的 64 位(8 字节)数据。
*(qlonglong*)hash.result().data()
将哈希结果的前 8 个字节重新解释为数字。您的平台是一个小端序平台,因此哈希数据的第一个字节被解释为结果数字的低字节。
因此,64 位数字(视为十六进制)以相反的顺序显示哈希数据的前 8 个字节。您可以在输出中看到:
89 bd ... 3c 47
是开头部分的反面
47 3c ... bd 89 e4 3f ...
你实际上是在将一个string
(作为const char*
)强制转换为long long*
,然后取消引用它,并将你得到的任何数值返回给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*
转换为long long*
并期望结果具有有效的数值是存在问题。
相关文章:
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 将十六进制转换为 DEC
- 将字符指针中的十六进制转换为十进制
- 使用 std::hex 将十六进制转换为十进制
- 将40个字节长的数据框从十六进制转换为二进制,然后转换为十进制
- 如何将十六进制转换为十进制
- 在C++中将十六进制转换为uint8_t
- 从十六进制转换为LPCVoid,切断了一半地址
- 将十六进制转换为可打印的字符串/字符
- 将 QString 十六进制转换为 ASCII 值
- 我如何在 C++ 中将变量从十六进制转换为 dec
- 混淆在C++中将十六进制转换为二进制
- C++中的十进制到十六进制转换代码
- 如何在C++中将十六进制转换为IEEE 754 32位浮点
- 十进制到十六进制转换错误
- 十进制到十六进制转换c++内置函数
- 如何将十六进制转换为字符串?C++
- 将 3d 数组元素从十六进制转换为二进制以获得 bmp
- C++:将十六进制转换为十进制
- 将十六进制转换为签名的十二月