Lua中字节数组转换为浮点数【浮点数据结构】

问题描述 投票:0回答:5

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

floating-point lua memcpy
5个回答
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

中列出的库之一

3
投票

要让一切顺利,需要做大量的工作。 您需要提取指数和有效数(有效数有时称为尾数),使用

math.frexp
转换为浮点数,然后在设置了符号位时对结果求反。您还必须识别非规范化数字和 NaN。 (在规范化数中,有效数的最高有效位是隐式的;在非规范化数中,它是显式的。) 如果您必须自己执行此操作,您会发现阅读 Dave Goldberg 的文章很有帮助,该文章介绍了计算机科学家需要了解的有关浮点的所有信息。 另请记住,Lua 数字是 IEEE 双精度数,请注意精度。

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

lua_pushnumber


2
投票

string.pack
/
string.unpack

传递

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


0
投票

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


0
投票

我稍微整理了@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

我可以确认这对于小端字节输入来说非常有效。

© www.soinside.com 2019 - 2024. All rights reserved.