我正在维基百科上查看以下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( float )结果可以以某种方式转换为1743128938(整数),但是我真的不知道如何。要获取浮点数小数部分的前32位,需要执行哪些步骤? Python只回答。
谢谢你。

最佳答案

对于十六进制常量,字节序无关紧要。每个数字是一个半字节,最后一个最低有效半字节。是否处理不同大小的指针确实很重要。如果确实需要使用字节顺序,则struct模块可以提供帮助。无论如何,您已经很好地检索了小数部分;只需将它们相乘和截断就可以轻松地将其转换为十六进制,因此我们得到一个整数:

>>> hex(int(math.modf(math.sqrt(2))[0]*(1<<32)))
'0x6a09e667'

关于python - 浮点数小数部分的前32位是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4674956/

10-16 12:03