Ste*_*gle 7 python hash bit-manipulation
我在维基百科上看下面的SHA256伪代码.
具体来说,我正在看以下部分.
//Initialize variables
//(first 32 bits of the fractional parts of the square roots of the first 8 primes 2..19):
h0 := 0x6a09e667
Run Code Online (Sandbox Code Playgroud)
我想弄清楚如何生成h0.我从评论中知道这应该是2的平方根的小数部分.我相信通过键入以下内容我可以得到2的平方根的小数部分.以下所有代码均来自python repl.
>>> math.modf(math.sqrt(2))[0]
0.41421356237309515
Run Code Online (Sandbox Code Playgroud)
在文件的顶部,它声明所有常量的声明都是Big Endian.我知道我的环境是Small Endian,因为我打字.
>>> import sys
>>> sys.byteorder
'little'
Run Code Online (Sandbox Code Playgroud)
因此,根据我对h0中十六进制值的手动操作,Little Endian表示应为0x67e6096a.
>>> int(0x67e6096a)
1743128938
Run Code Online (Sandbox Code Playgroud)
而且我被困住了.我尝试过各种各样的操作,但是没有这些操作最终得到了这个结果.我不知道如何获得浮点数的小数部分的前32位.我知道不知怎的,我的0.41421356237309515(浮点)结果可以转换成1743128938(int),但我真的不知道怎么做.获取浮点数的小数部分的前32位所需的步骤是什么?Python请回答.
谢谢.
Yan*_*ier 10
对于十六进制常数,字节顺序无关紧要; 每个数字都是半字节,最低有效半字节为最后一个.如果你处理不同大小的指针,这很重要.如果确实需要使用字节顺序,那么struct模块可以提供帮助.无论如何,你已经很好地检索了小数部分; 将它转换为十六进制很容易通过简单的乘法和截断来完成,所以我们得到一个整数:
>>> hex(int(math.modf(math.sqrt(2))[0]*(1<<32)))
'0x6a09e667'
Run Code Online (Sandbox Code Playgroud)
瞧.(对于不做Python回答的OP表示抱歉,但我希望方法很明确.)
Python 可以将精确的 IEEE 754 浮点数据显示为十六进制值。它包括隐含的前导 1、十六进制尾数和指数值:
>>> math.sqrt(2).hex()
'0x1.6a09e667f3bcdp+0'
Run Code Online (Sandbox Code Playgroud)
根据需要切片,例如:
>>> '0x'+math.sqrt(2).hex().split('.')[1][:8]
'0x6a09e667'
Run Code Online (Sandbox Code Playgroud)