将数字转换为浮点字节

我知道Lua使用双精度数字格式,所以我想知道是否有一种方法可以直接将数字转换为字符串,作为浮点值(4个字节),以便可以通过UDP套接字发送。

点赞
用户1847592
用户1847592

对于 Lua 5.3+

local function float32_binary_dump(value)
   return ("<f"):pack(value)
end

对于 Lua 5.1+

local function float32_binary_dump(value)
   local img, s, h, d = 2^32 - 2^22, "", 1
   if value == value then
      img = 2^31 - 2^23
      if value < 0 or value == 0 and 1/value < 0 then
         value, img = -value, 2^32 - 2^23
      end
      if value > 0.5 * 2^-149 and value < 2^128 then
         -- 将 64 位双精度浮点数舍入为 32 位单精度浮点数
         d = math.floor(math.log(value)/math.log(2) + 0.5)
         d = value < 2^d and d - 1 or d
         local e = 2^(d < -126 and -149 or d - 23)
         value = value + 0.5 * e
         local r = value % e
         value = value - (r == 0 and value % (e + e) or r)
      end
      -- 转储 32 位浮点图像
      if value < 2^-149 then
         img = img - (2^31 - 2^23)
      elseif value <= 2^128 - 2^104 then
         if d < -126 then
            d, h = -126, 0
         end
         img = img + (value / 2^d + (d - (-126)) * h - 255) * 2^23
      end
   end
   -- 将 32 位图像转换为小端字符串
   while #s < 4 do
      local b = img % 256
      s = s..string.char(b)
      img = (img - b) / 256
   end
   return s
end
2020-06-04 21:52:49