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

[原创]123为什么是F642

2023-2-20 19:38
6493

场景

通过流量抓包的方式获取了一段明文,已知这段数据含有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的存储格式
b04K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6T1L8r3!0Y4i4K6u0W2j5%4y4V1L8W2)9J5k6h3&6W2N6q4)9J5c8Y4q4I4i4K6g2X3x3K6j5J5x3o6j5H3y4K6m8Q4x3V1k6S2M7Y4c8A6j5$3I4W2i4K6u0r3k6r3g2@1j5h3W2D9M7#2)9J5c8U0R3&6y4U0R3K6z5o6b7^5

 

2.float数据在内存中的存储方法
b81K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2U0L8X3u0D9L8$3N6K6i4K6u0W2j5$3!0E0i4K6u0r3M7$3S2S2L8X3N6T1L8$3I4W2K9g2)9J5c8Y4m8Q4x3V1j5@1y4o6b7I4z5e0b7$3i4K6u0W2K9s2c8E0L8l9`.`.

 

3.How to convert a float into hex
73bK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6K6N6r3q4U0K9$3!0$3k6i4u0X3L8r3!0%4i4K6u0W2j5$3!0E0i4K6u0r3M7i4g2W2M7%4c8A6L8$3&6K6i4K6u0r3x3U0x3$3x3U0b7J5x3e0u0Q4x3V1k6Z5L8%4N6Q4x3X3c8@1L8#2)9J5k6r3y4G2L8Y4k6W2M7Y4c8Q4x3X3c8S2i4K6u0V1k6X3I4G2j5i4c8Q4x3X3c8A6L8Y4c8G2i4K6u0V1K9r3g2^5i4K6u0r3y4e0l9%4y4e0V1^5z5e0N6Q4x3U0x3#2x3o6M7#2z5e0R3&6y4H3`.`.

 

4.Python基础之:struct和格式化字符
4f3K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2U0L8X3u0D9L8$3N6K6i4K6u0W2j5$3!0E0i4K6u0r3k6X3I4&6k6r3g2S2L8W2)9J5c8Y4m8Q4x3V1j5I4y4o6j5$3y4e0f1I4x3q4)9J5k6h3S2@1L8h3H3`.

附件

1.《Python基础之:struct和格式化字符》[参考4]摘要
字节顺序,大小和对齐方式
默认情况下,C类型以机器的本机格式和字节顺序表示,并在必要时通过填充字节进行正确对齐(根据C编译器使用的规则)。
我们也可以手动指定格式字符串的字节顺序,大小和对齐方式:
图片描述

 

格式字符
图片描述


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2023-2-20 23:02 被Jtian编辑 ,原因:
上传的附件:
收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 5145
活跃值: (6775)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
字节序,大小端
2023-2-20 20:26
0
雪    币: 3269
活跃值: (3269)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
3
IEEE754。

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

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

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