我正在尝试读取DWORD
有两个FILETIME
的文件(这是一个预取文件)。
我读取偏移量0x81(0x80 + 1,因为lua中有1个索引)。如何仅使用lua来获取8个字节并转换为文件时间?
在我的十六进制编辑器中从0x80开始,我有:
FB54B341B70CCf01
需要与2014年8月1日相关
答案 0 :(得分:1)
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位是最重要的设定位,所以这个值在本世纪是合理的。