欢迎光临散文网 会员登陆 & 注册

【UE4】UnLua怎么读取二进制数据中的float?

2021-01-27 17:20 作者:天空游荡的鱼  | 我要投稿


    最近正好在做Lua的网络消息处理,希望将C++没有处理到的消息转给Lua处理。

刚好遇到一个问题, Lua解析buff,怎么处理浮点数?我们都知道如果是int,直接读取每个字节按‘字节序’放在高低位就可以了。但float怎么办呢?

    为了处理这个问题,今天就来讲讲浮点数的存储方式或者叫做计算方式。

整型数据比较简单,除去符号位,2<<n + 2<<n-1 + ...(这里<<指2的N次方,不会打上角标)

float是32位占四个字节

0100001 10001101 00000000 00000000

总共分为三段

0     1000011     00011010000000000000000


要搞懂这样表示的意思,首先得知道,浮点数是用科学计数法标记的,即:

123.375需要表示成1.23375 e-2


第一段1位为符号位:0表示正,1表示负

第二段8位为小数点位置:即上面的e-2,这里需要注意,计算出来的值为了表示正负,会+127, 如果要还原成小数位需要-127

第三段23位(其实是24位):表示前面的具体数据


接下来我们看看例子:

(二进制转十进制)

0 1000011 00011010000000000000000

0代表正数

10000110代表e,按二进制计算方式e = 128 + 2 + 1 - 127 = 4

还剩余23位为实数,前面讲了其实是24位,最前面以为总是为1

所以,剩余的二进制就是100011010000000000000000(补齐24位),小数点的位置在第4位(e)

10001.1010000000000000000现在计算整数部分的值2<<4 + 1=17,小数部分的值(1/2) + (1/2)三次方=0.5 + 0.125=0.625

所以0100001 10001101 00000000 00000000表示为float,它的值就是十进制的17.625


(十进制转二进制)

比如的123.375

先将123转为二进制01111011,.375转二进制0.011

所以24位的二进制为:01111011.011,小数点在第6位即e=6 + 127 = 128 + 4 + 2 + 1 = 10000111

0 10000111 1110110 11000000 00000000

你会了吗?



    浮点数知道怎么计算了,那Lua有办法处理吗?或者说有没有简单的办法处理?

    我反正是放弃了,最后让C++提供函数转吧(虽然消耗会大些)。

    如果你有好的办法,希望赐教,加群交流。

    群号:1047387740验证密码关注后会收到


【UE4】UnLua怎么读取二进制数据中的float?的评论 (共 条)

分享到微博请遵守国家法律