-
-
[原创]123为什么是F642
-
2023-2-20 19:38
5268
-
场景
通过流量抓包的方式获取了一段明文,已知这段数据含有123这个值,可是在payload中既没有"123"字符串,也没有对应的0x7B,让人困惑。后来,分析发现,这个123是个单精度浮点数,即float类型,对应的十六进制值为0x42F60000,刚好可以对应payload里的"0000F642"。进而有了文章标题的问题,为什么float 123 对应F642?如何计算任意浮点数对应的二进制值?
测试用例
浮点数的存储格式
查找资料可知,浮点数的存储方式与整数不同,其由符号位、阶码和尾码组成。float为4字节(32位),符号位、阶码和尾码分别占1位、8位、23位。
图 浮点数存储格式[参考1]
图 浮点数存储格式[参考2]
计算方法
以单精度浮点数123.0举例,
其二进制数为 01111011 (0x7B)
使用科学记数法表示为 1.111011*2^6 (1.111011右移6位可得01111011;不严谨的表达,但应该能理解,1.111011是二进制数,但2和6是十进制数)
符号位为 0 (正数为0,负数为1)
阶码为6+127=133,即10000101 (根据资料,加上127是规定,估计是为了方便表示负指数)
尾码为 111011+补0(尾码为1.111011的小数部分,即111011)
综上,符号位+阶码+尾码 为
0+10000101+111011+17个0,即
0100 0010 1111 0110 0000 0000 0000 0000,即0x42F60000
将任意浮点数转成二进制值
python里有现成的库可以解决这个问题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import struct
def float_to_bytes_hex(f):
bs = struct.pack( "f" ,f)
return bs. hex ()
def double_to_bytes_hex(d):
bs = struct.pack( "d" ,d)
return bs. hex ()
a = float_to_bytes_hex( 123 )
print (a)
b = double_to_bytes_hex( 123 )
print (b)
|
效果
参考
1.float和double的存储格式
https://blog.csdn.net/qq_36206070/article/details/89683848
2.float数据在内存中的存储方法
https://www.cnblogs.com/shangbolei/p/4441946.html
3.How to convert a float into hex
https://stackoverflow.com/questions/23624212/how-to-convert-a-float-into-hex/50759897#50759897
4.Python基础之:struct和格式化字符
https://www.cnblogs.com/flydean/p/14665510.html
附件
1.《Python基础之:struct和格式化字符》[参考4]摘要
字节顺序,大小和对齐方式
默认情况下,C类型以机器的本机格式和字节顺序表示,并在必要时通过填充字节进行正确对齐(根据C编译器使用的规则)。
我们也可以手动指定格式字符串的字节顺序,大小和对齐方式:
格式字符
[培训]《安卓高级研修班(网课)》月薪三万计划
最后于 2023-2-20 23:02
被Jtian编辑
,原因: