首页
社区
课程
招聘
[原创]123为什么是F642
2023-2-20 19:38 5268

[原创]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)   # > 大端
    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编辑 ,原因:
上传的附件:
收藏
点赞0
打赏
分享
最新回复 (3)
雪    币: 2554
活跃值: (4328)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
guduzhe 2023-2-20 20:26
2
0
字节序,大小端
雪    币: 3262
活跃值: (2669)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
xhyeax 2023-2-20 21:09
3
1
IEEE754。

十进制123对应十六进制42F60000,大小端转换后即为0000F642
雪    币: 205
活跃值: (2470)
能力值: ( LV7,RANK:140 )
在线值:
发帖
回帖
粉丝
yeyeshun 2 2023-2-21 20:31
4
1

如果只是要看一个浮点数的十六进制的话,有个简单的办法。

最后于 2023-2-21 20:33 被yeyeshun编辑 ,原因:
游客
登录 | 注册 方可回帖
返回