在Lua中将字节数组转换为浮点数 [浮点数数据结构]
我有能力用 Lua 读取内存,但我遇到了一个问题。 我想读取一个浮点值。
我在内存中有一个我认为是浮点数的东西,它看起来像这样。
Byte Array 65 B6 40 43 EC 35 87 41 51 04 9E 3F
Float Value 192.712478637695
我知道浮点值,因为我正在使用一个内存编辑器。 在 Lua 中,我有一个类似于 memcpy 的函数,它称为 readmem(Address,bytes),它返回一个整数值。
如何使用 readmem 将字节数组读取到 Lua 中的浮点数。
为了这个问题,你可以假设 65 中的 6 是地址 00000000。
原文链接 https://stackoverflow.com/questions/3178500
奇怪,看起来这是按中间字节序存储的。(我用 http://www.h-schmidt.net/FloatApplet/IEEE754.html 进行了检查)
无论如何,你可以使用来自http://yueliang.luaforge.net/的代码在纯 Lua 中进行转换。
另请参阅http://lua-users.org/lists/lua-l/2010-03/msg00910.html
如果你可以使用 C,可以尝试列表中列出的任一库http://lua-users.org/wiki/StructurePacking。
这是一项相当繁琐的工作,需要做好所有细节。你需要提取指数和尾数(有时尾数也称为尾数),使用math.frexp
将其转换为浮点数,如果符号位已设置,则还需要取反结果。你还需要识别非规格化数和NaN(在规格化数中,尾数的最高有效位是隐含的;在非规格化数中,它是显式的)。
如果你坚持要自己做,读一读戴夫·戈德堡的文章,它涵盖了计算机科学家需要了解的关于浮点数的一切信息。
还要注意,Lua数字是IEEE双精度浮点数,并且要注意精度。
如果我自己做,我不会选择这么麻烦的方法,而是写C代码读取字节并调用lua_pushnumber
函数。
当第一个参数为 'f'
时,将返回一个 4 个字节的单精度表示字符串,而 'd'
则会返回一个 8 个字节的双精度表示字符串。你还可以声明浮点数的字节顺序。
我稍微改进了@lhf的答案:
function BinToFloat32(bin)
local sig = bin:byte(3) % 0x80 * 0x10000 + bin:byte(2) * 0x100 + bin:byte(1)
local exp = bin:byte(4) % 0x80 * 2 + math.floor(bin:byte(3) / 0x80) - 0x7F
if exp == 0x7F then return 0 end
return math.ldexp(math.ldexp(sig, -23) + 1, exp) * (bin:byte(4) < 0x80 and 1 or -1)
end
我可以确认,这个函数对于小端字节输入完美适用。
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
你必须编写一个 C 函数来完成转换。Lua 没有强制类型转换或类似的东西。