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