LUA 將16進制數 與 IEEE - 754 浮點數 互轉

一,說明:

1,傳遞參數需要是16進制格式的字符串,或者數字(不支持負數)

2,只支持32位,單精度

3,提供一個驗證使用的網址https://www.h-schmidt.net/FloatConverter/IEEE754.html

4,Hex轉浮點數 代碼如下:

--備註:math.modf() 這個函數就是爲了獲取除法的整數部分
function hexToFloat( hexString )
	if hexString == nil then
		return 0
	end
	local t = type( hexString )
	if t == "string" then
		hexString = tonumber(hexString , 16)
	end

	local hexNums = hexString

	local sign = math.modf(hexNums/(2^31))

	local exponent = hexNums % (2^31)
	exponent = math.modf(exponent/(2^23)) -127

	local mantissa = hexNums % (2^23)

	for i=1,23 do
		mantissa = mantissa / 2
	end
	mantissa = 1+mantissa
--	print(mantissa)
	local result = (-1)^sign * mantissa * 2^exponent
	return result
end

5,浮點數轉Hex字符

function FloatToHex( floatNum )
	local S = 0
	local E = 0
	local M = 0
	if floatNum == 0 then
        return "00000000"
    end
	local num1,num2 = math.modf(floatNum/1)
	local InterPart = num1

	if floatNum > 0 then
		S = 0 * 2^31
	else
		S = 1 * 2^31
	end
	local intercount = 0
	repeat
		num1 = math.modf(num1/2)
		intercount = intercount + 1
	until (num1 == 0)

	E = intercount - 1
	local Elen = 23 - E
	InterPart = InterPart % (2^E)
	InterPart = InterPart * (2^Elen)

	E = E + 127
	E = E * 2^23

	for i=1,Elen do
		num2 = num2 * 2
		num1,num2 = math.modf(num2/1)
		M = M + num1 * 2^(Elen - i)
	end

	M = InterPart + M

	--E值爲整數部分轉成二進制數後左移位數:22.8125 轉成二進制10110.1101,左移4位 1.01101101
    --E=4 ,再加上127 就爲所需E值
	--010000011 01101101 000000000000000

	local Result = S + E + M

	Result = string.format("%08X",Result)
	return Result
end

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章