【问题标题】:6-byte little-endian sequence from 32-bit timestamp multiplied by 1000来自 32 位时间戳的 6 字节 little-endian 序列乘以 1000
【发布时间】:2018-05-01 14:10:18
【问题描述】:

取 y = 1510751840。假设您想要数字 y*1000 的 6 字节 little-endian 字节序列。您正在使用 Lua 5.1。你怎么能得到它?没有整数数据类型,只有双精度,这是 Lua 的默认值。怎么可能?

例如,如果 y = 1510743753,则 6 字节序列应为:01 5f bf 58 41 28。

谢谢!

我为什么要问?我必须使用 Lua 嵌入式系统为自 UNIX 纪元以来的毫秒数生成一个 little-endian 序列。我只有秒数,所以我可以生成这个数字的 little-endian 4 字节序列。但我必须生成一个 6 字节、48 位的字节序列。所以我的想法是将 32 位时间戳乘以 1000,但我似乎无法在 Lua 5.1 可嵌入系统中乘以该数字。所以我希望有一个 hack 可以让我得到对应于时间戳 * 1000 的 6 字节序列。

【问题讨论】:

标签: lua 32bit-64bit 32-bit


【解决方案1】:
local y = 1510743753

local lo16 = y % 2^16 * 1000 % 2^16
local hi32 = (y - y % 2^16) / 2^16 * 1000 + (y % 2^16 * 1000 - lo16) / 2^16

print(("%08x %04x"):format(hi32, lo16))   -->  015fbf58 4128

【讨论】:

    【解决方案2】:

    另一种方法:

    function byte_n(val,byte_num)
      val = val * 1000
      for i = 1, byte_num-1 do
        val = ('%.0f'):format((val - val % 256) / 256)
      end
      return ('%02x'):format(val % 256)
    end
    
    y = 1510743753      --> 01 5f bf 58 41 28
    
    print(byte_n(y,6))  --MSB
    print(byte_n(y,5))
    print(byte_n(y,4))
    print(byte_n(y,3))
    print(byte_n(y,2))
    print(byte_n(y,1))  --LSB
    

    【讨论】:

      猜你喜欢
      • 2022-12-12
      • 2012-10-09
      • 2010-10-16
      • 1970-01-01
      • 2018-08-09
      • 1970-01-01
      • 2017-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多