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

假设y = 1510751840。如果您想要表示y×1000的6个字节的小端序列,使用Lua 5.1,怎么实现呢?Lua中没有整数数据类型,只有double,这是Lua的默认数据类型。该怎么做?

例如,如果y = 1510743753,那么6个字节的序列应该是:01 5f bf 58 41 28。

谢谢!

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

点赞
用户1847592
用户1847592
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

本地变量 y 被初始化为 1510743753

变量 lo16 的值为 y 除以 2^16 取余的结果乘以1000再取2^16的余数

变量 hi32 的值为 (y - y % 2^16) / 2^16 * 1000 + (y % 2^16 * 1000 - lo16) / 2^16,主要是对变量 y 进行二进制位的操作

最后,将 hi32lo16 的值按照 8 位和 4 位十六进制的格式打印出来

2017-11-17 18:25:54
用户3735873
用户3735873

一种替代方案:

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
2017-11-17 18:57:42