我有能力用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。
奇怪的是,这似乎是按中端顺序存储的。 (我用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。 (在规范化数中,有效数的最高有效位是隐式的;在非规范化数中,它是显式的。)
如果您必须自己执行此操作,您会发现阅读 Dave Goldberg 的文章很有帮助,该文章介绍了计算机科学家需要了解的有关浮点的所有信息。
另请记住,Lua 数字是 IEEE 双精度数,请注意精度。
如果我自己这样做,我就不可能经历所有这些痛苦 - 相反,我会 编写 C 代码来读取字节并调用
lua_pushnumber
。
您必须编写一个 C 函数来完成转换。 Lua 没有强制转换或类似的东西。
我稍微整理了@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
我可以确认这对于小端字节输入来说非常有效。