【UE4】UnLua怎么讀取二進(jìn)制數(shù)據(jù)中的float?
????最近正好在做Lua的網(wǎng)絡(luò)消息處理,希望將C++沒(méi)有處理到的消息轉(zhuǎn)給Lua處理。
剛好遇到一個(gè)問(wèn)題, Lua解析buff,怎么處理浮點(diǎn)數(shù)?我們都知道如果是int,直接讀取每個(gè)字節(jié)按‘字節(jié)序’放在高低位就可以了。但float怎么辦呢?
????為了處理這個(gè)問(wèn)題,今天就來(lái)講講浮點(diǎn)數(shù)的存儲(chǔ)方式或者叫做計(jì)算方式。
整型數(shù)據(jù)比較簡(jiǎn)單,除去符號(hào)位,2<<n + 2<<n-1 + ...(這里<<指2的N次方,不會(huì)打上角標(biāo))
float是32位占四個(gè)字節(jié)
0100001 10001101 00000000 00000000
總共分為三段
0 ????1000011 ????00011010000000000000000
要搞懂這樣表示的意思,首先得知道,浮點(diǎn)數(shù)是用科學(xué)計(jì)數(shù)法標(biāo)記的,即:
123.375需要表示成1.23375 e-2
第一段1位為符號(hào)位:0表示正,1表示負(fù)
第二段8位為小數(shù)點(diǎn)位置:即上面的e-2,這里需要注意,計(jì)算出來(lái)的值為了表示正負(fù),會(huì)+127, 如果要還原成小數(shù)位需要-127
第三段23位(其實(shí)是24位):表示前面的具體數(shù)據(jù)
接下來(lái)我們看看例子:
(二進(jìn)制轉(zhuǎn)十進(jìn)制)
0 1000011 00011010000000000000000
0代表正數(shù)
10000110代表e,按二進(jìn)制計(jì)算方式e = 128 + 2 + 1 - 127 = 4
還剩余23位為實(shí)數(shù),前面講了其實(shí)是24位,最前面以為總是為1
所以,剩余的二進(jìn)制就是100011010000000000000000(補(bǔ)齊24位),小數(shù)點(diǎn)的位置在第4位(e)
10001.1010000000000000000現(xiàn)在計(jì)算整數(shù)部分的值2<<4 + 1=17,小數(shù)部分的值(1/2) + (1/2)三次方=0.5 + 0.125=0.625
所以0100001 10001101 00000000 00000000表示為float,它的值就是十進(jìn)制的17.625
(十進(jìn)制轉(zhuǎn)二進(jìn)制)
比如的123.375
先將123轉(zhuǎn)為二進(jìn)制01111011,.375轉(zhuǎn)二進(jìn)制0.011
所以24位的二進(jìn)制為:01111011.011,小數(shù)點(diǎn)在第6位即e=6 + 127 = 128 + 4 + 2 + 1 = 10000111
0 10000111 1110110 11000000 00000000
你會(huì)了嗎?

????浮點(diǎn)數(shù)知道怎么計(jì)算了,那Lua有辦法處理嗎?或者說(shuō)有沒(méi)有簡(jiǎn)單的辦法處理?
????我反正是放棄了,最后讓C++提供函數(shù)轉(zhuǎn)吧(雖然消耗會(huì)大些)。
????如果你有好的辦法,希望賜教,加群交流。
????群號(hào):1047387740驗(yàn)證密碼關(guān)注后會(huì)收到