Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 混淆从字节到十六进制的基转换_C++_Qt_Pointers - Fatal编程技术网

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

C++ 混淆从字节到十六进制的基转换,c++,qt,pointers,C++,Qt,Pointers,我在使用这个代码时遇到了一些问题。number应该从散列中获取QByteArray并将其转换为十六进制,但是结果比我预期的要短得多。我在想两种输出应该是相同的。我认为这与指针转换有关,但我不明白该转换做得好到什么程度,以了解如何进行值转换 有人能解释为什么这两行输出不同的结果吗?最好用数学术语。 代码 预期产出: "473cc856cae3bd89e43ff9f62963d6f38372ccbd" "473cc856cae3bd89e43ff9f62963d6f38372ccbd" 注意:

我在使用这个代码时遇到了一些问题。number应该从散列中获取QByteArray并将其转换为十六进制,但是结果比我预期的要短得多。我在想两种输出应该是相同的。我认为这与指针转换有关,但我不明白该转换做得好到什么程度,以了解如何进行值转换

有人能解释为什么这两行输出不同的结果吗?最好用数学术语。

代码

预期产出:

"473cc856cae3bd89e43ff9f62963d6f38372ccbd" 
"473cc856cae3bd89e43ff9f62963d6f38372ccbd" 

注意:我的实际问题是36进制,而不是16进制,但是有一个方便的.toHex方法使其更易于显示。

实际上是将
字符串
(作为
常量字符*
)转换为
长*
,然后取消对它的引用,并将得到的数值返回到
QByteArray
的构造函数。如果不使用
qt
类,您将执行以下操作:

std::string s = "1b3";
const char* cc = s.c_str();

std::cout<<cc<<std::endl;
std::cout<<*(long long*)cc<<std::endl;

这不是数学问题。。。将
char*
强制转换为
long*
并期望得到有效的数值是一个问题。

实际上是将
字符串
(作为
常量char*
)强制转换为
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;

这不是数学问题。。。将
char*
强制转换为
long*
并期望得到一个有效的数值是一个问题。

在您的代码中
hash.result().data()
指向160位(20字节)的数据。
qlonglong
是平台上64位(8字节)的数据

*(qlonglong*)hash.result().data()
将哈希结果的前8个字节重新解释为一个数字。您的平台是一个小endian平台,因此哈希数据的第一个字节被解释为结果数的低字节

因此,64位数字(以十六进制形式查看)以相反顺序显示哈希数据的前8个字节。您可以在输出中看到:

89 bd ... 3c 47
是的初始部分的相反

47 3c ... bd 89    e4 3f ...

在您的代码中,hash.result().data()指向160位(20字节)的数据。
qlonglong
是平台上64位(8字节)的数据

*(qlonglong*)hash.result().data()
将哈希结果的前8个字节重新解释为一个数字。您的平台是一个小endian平台,因此哈希数据的第一个字节被解释为结果数的低字节

因此,64位数字(以十六进制形式查看)以相反顺序显示哈希数据的前8个字节。您可以在输出中看到:

89 bd ... 3c 47
是的初始部分的相反

47 3c ... bd 89    e4 3f ...

在猜测中,<代码> QLangLange大概是64位,这太小了,不能容纳SHA-1哈希(160位)。JerryCoffin,我忘了C++编译器假设你知道你用指针做什么。因此,习惯于不允许一个会截断数据的语言。在猜测中,<代码> QLangLange大概是64位,这太小了,不能容纳SHA-1哈希(160位)。JerryCoffin,我忘了C++编译器假设你知道你用指针做什么。因此用于不允许强制转换来截断数据的语言。显然,
散列。result
不是字符串,而是表示字节序列的类(可能是
QByteArray
),所以它的
data()
方法指向原始二进制数据。@JoergB我被提到“返回的字符串”。我想你是对的。显然,
散列。result
不是字符串,而是一个表示字节序列的类(可能是
QByteArray
),所以它的
data()
方法指向原始二进制数据。@JoergB我被提到a的
QByteArray::data
弄糊涂了。”返回字符串“。我认为你是正确的。有意义。很高兴我刚才假设sha1可以放入64位。谢谢有意义。很高兴我刚才假设sha1可以放入64位。谢谢