来自32位时间戳的6字节小端序列乘以1000

时间:2017-11-17 18:05:30

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

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

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

谢谢!

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

另一种方法:

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