【UE4】UnLua怎么读取二进制数据中的float?
最近正好在做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验证密码关注后会收到