2010-07-05 29 views
0

我有能力用Lua读取内存,但遇到了问题。 我想读取一个浮点值。在Lua中将字节数组转换为浮点数[Float Data Structure]

我有,我认为是一个浮动,在内存中看起来像这样。

Byte Array 65 B6 40 43 EC 35 87 41 51 04 9E 3F 
Float Value 192.712478637695 

我知道float值,因为我使用的是内存编辑器。 在Lua中我有一个类似于memcpy的函数,它叫做readmem(Address,bytes)它返回一个整数值。

我该如何将字节数组读取到使用readmem的Lua中的float中。

对于这个问题的缘故,我想你可以假设,在65 6的地址00000000

回答

0

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

+0

我相信你可以完成任务而不用在C中添加一个函数来转换它,尽管我意识到这是简单的出路。我敢肯定,如果我更好地理解float数据结构如何工作,我可以形成一个字符串,然后将其转换为Lua中的float。 由于我有能力直接读取内存,我真的没有看到什么阻止我将一个浮动补丁一起。 这是一个懒惰的答案我不能投票下来,因为我的代表不够高。 – Nowayz 2010-07-05 09:53:04

+0

@Nowayz:理论上,这是可能的。但是,实际上,你会对浮点数据结构做出许多假设。另外,你只能将它转换为一个数字,这是一个双精度值,而不是浮点数。另外,你的字节数组不是一个浮点数。浮点数是32位或4字节。你有12个字节。这只是你想要做的错误的一个例子。如果你有C中的地址,那么你可以执行一个指针转换来获得原始表示,但它仍然是错误的。 – Puppy 2010-07-05 10:04:48

3

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

如果我自己这样做,我不会经历所有这些痛苦—而不是我想写C代码来读取字节并呼吁lua_pushnumber

0

string.pack

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