0

我有能力用 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。

4

4 回答 4

5

奇怪,这似乎是按中端顺序存储的。(我用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中列出的库之一

于 2010-07-05T10:57:40.813 回答
3

这是一个相当大的工作量,以使一切都正确。您需要提取指数和有效数字(有效数字有时称为尾数),使用 转换为浮点数math.frexp,然后在设置符号位时取反结果。您还必须识别非规范化数字和 NaN。(在规范化的数字中,有效数字的最高位是隐含的;在非规范化的数字中,它是显式的。)如果您只是必须自己做,您会发现阅读 Dave Goldberg 关于计算机科学家需要做的一切的文章会很有帮助了解浮点数。还要记住,Lua 数是 IEEE 双精度数,请注意精度。

如果我自己这样做,我就不会经历所有这些痛苦——相反,我会编写 C 代码来读取字节并调用lua_pushnumber.

于 2010-07-05T18:26:20.193 回答
1

string.pack

作为第一个参数传递'f'将返回单精度表示的 4 字节字符串,而'd'将返回双精度表示的 8 字节字符串。您甚至可以声明浮点数的字节顺序

于 2017-07-05T22:36:06.063 回答
0

您必须编写一个 C 函数来完成转换。Lua 没有演员表或类似的东西。

于 2010-07-05T09:49:29.843 回答