在Lua中将字节数组转换为浮点数 [浮点数数据结构]

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

原文链接 https://stackoverflow.com/questions/3178500

点赞
stackoverflow用户298661
stackoverflow用户298661

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

2010-07-05 09:49:29
stackoverflow用户107090
stackoverflow用户107090

奇怪,看起来这是按中间字节序存储的。(我用 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-05 10:57:40
stackoverflow用户41661
stackoverflow用户41661

这是一项相当繁琐的工作,需要做好所有细节。你需要提取指数和尾数(有时尾数也称为尾数),使用math.frexp将其转换为浮点数,如果符号位已设置,则还需要取反结果。你还需要识别非规格化数和NaN(在规格化数中,尾数的最高有效位是隐含的;在非规格化数中,它是显式的)。

如果你坚持要自己做,读一读戴夫·戈德堡的文章,它涵盖了计算机科学家需要了解的关于浮点数的一切信息。

还要注意,Lua数字是IEEE双精度浮点数,并且要注意精度。

如果我自己做,我不会选择这么麻烦的方法,而是写C代码读取字节并调用lua_pushnumber函数。

2010-07-05 18:26:20
stackoverflow用户4237232
stackoverflow用户4237232

string.pack

当第一个参数为 'f' 时,将返回一个 4 个字节的单精度表示字符串,而 'd' 则会返回一个 8 个字节的双精度表示字符串。你还可以声明浮点数的字节顺序。

2017-07-05 22:36:06
stackoverflow用户8408471
stackoverflow用户8408471

我稍微改进了@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

我可以确认,这个函数对于小端字节输入完美适用。

2022-10-11 20:04:09