我有能力用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。
答案 0 :(得分:4)
很奇怪,这似乎以中端顺序存储。 (我用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
中列出的其中一个库答案 1 :(得分:3)
要完成所有事情,这是相当多的工作。
您需要提取指数和有效数字(有效数字有时称为尾数),使用math.frexp
转换为浮点数,然后在设置符号位时否定结果。您还必须识别非规范化数字和NaN。 (在标准化数字中,有效数字的最高有效位是隐式的;在非规范化数字中,它是显式的。)
如果您只是自己必须这样做,您会发现阅读Dave Goldberg关于计算机科学家需要了解浮点数的所有内容的文章会很有帮助。
另外请记住,Lua数是IEEE的两倍,并且要注意精度。
如果我自己这样做,我就无法忍受所有这些痛苦 - 而是编写C代码来读取字节并调用lua_pushnumber
。
答案 2 :(得分:0)
您必须编写C函数才能完成转换。 Lua没有演员表或类似的东西。
答案 3 :(得分:0)
传递'f'
作为第一个参数将返回单精度表示的4字节字符串,而'd'
将返回双精度表示的8字节字符串。你甚至可以声明浮点数的字节顺序