如何在LUA中将DWORD转换为FILETIME?

时间:2014-01-09 15:56:33

标签: lua

我正在尝试读取DWORD有两个FILETIME的文件(这是一个预取文件)。

我读取偏移量0x81(0x80 + 1,因为lua中有1个索引)。如何仅使用lua来获取8个字节并转换为文件时间?

在我的十六进制编辑器中从0x80开始,我有:

FB54B341B70CCf01

需要与2014年8月1日相关

1 个答案:

答案 0 :(得分:1)

什么是FILETIME

Windows平台defines FILETIME是一个64位整数“自1601年1月1日以来的100ns间隔计数”。

在Lua中处理FILETIME时,您将面临至少两个挑战。

首先,FILETIME是一个64位整数,Lua在内部将数字存储为IEEE双精度,它只支持56位精度。对于我刚刚写过的信封的精确度,你今天需要超过57个有效位作为FILETIME

(旁白:我估计通过注意到一年中大约1e7 * pi秒,1秒内每秒100秒,现在是FILETIME时代之后大约413年。所以2014年的日期需要关于log2(413e14 * pi)位,或略多于57位。)

其次,纯Lua没有易于使用的函数来将二进制数据结构转换为本机Lua数据类型和从本机Lua数据类型转换。从string.byte()string.sub()构建这样的函数并不困难,因为字符串是8位干净的,所以甚至可以安全地执行。但这是你必须自己建立或从第三方来源找到的东西。

但请注意,尽管存在二进制结构库,但由于Lua数的限制,它们中的许多只提供对64位整数的有限支持。您可能更适合在C中手工制作的模块,它在FILETIME中存储userdata并提供合适的运算符以允许它们进行比较,转换为字符串和从字符串转换,等等。

您的示例

  

在我的十六进制编辑器中从0x80开始,我有:

FB54B341B70CCf01
     

需要与2014年8月1日相关

PC上的Windows是一个小端平台。这意味着值与最低有效字节一起存储在最低地址。因此,我们可以通过反转字节来重写您的示例时间戳以使其更具可读性:

  

01CF0CB741B354FB

正如预期的那样,第57位是最重要的设定位,所以这个值在本世纪是合理的。