怎样在 LUA 中将 DWORD 转换成 FILETIME?
2014-1-16 1:55:43
收藏:0
阅读:89
评论:1
我正在尝试读取一个包含两个 DWORD 类型数据的文件,这个文件的类型是 FILETIME(这是一个预读文件)。
我在文件偏移量为 0x81(由于 Lua 的索引是从 1 开始的,所以需要加上 1)处进行读取。我该如何将这 8 个字节转换为文件时间戳,并仅使用 Lua 完成?
在十六进制编辑器中,从 0x80 开始,我有:
FB54B341B70CCf01
需要将其转换为 2014年1月8日 的文件时间戳。
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
什么是FILETIME
Windows平台 定义
FILETIME为64位整数,“从1601年1月1日UTC起每100纳秒一个计数的总数”。你在使用 Lua 处理
FILETIME时至少会遇到两个挑战。首先,一个
FILETIME是一个64位整数,而 Lua 内部存储数字使用IEEE双精度,只支持56位精度。根据我刚刚草绘的信封的精度,你需要超过57个有效位来命名今天的任何时间作为FILETIME。(顺便说一句:我估计了一下,发现一年里大约有1e7*pi秒钟,在一秒钟内有1e7个100纳秒的滴答声,今天距离
FILETIME时期大约413年。因此2014年的日期大约需要log2(413e14* pi)位,或者略大于57位。)其次,纯Lua没有易于使用的函数将二进制数据结构转换为本地Lua数据类型。虽然使用
string.byte()和string.sub()来构建这样的函数并且安全性良好,但是这是你必须自己构建的,或者从第三方来源找到。但是要注意,尽管有二进制结构库,但由于Lua数字的限制,其中许多只提供对64位整数的有限支持。您可能最好使用 C 编写的手工制作的模块,该模块将
FILETIME存储在userdata中,并提供适当的运算符以允许它们进行比较、转换为和从字符串中转换等操作。你的例子
PC上的Windows是一个小端平台。这意味着值存储在具有最低地址的最不重要的字节。因此,我们可以通过反转字节来使您的样本时间戳更加可读:
正如预期的那样,第57位是最重要的设置位,因此这个值是这个世纪的合理值。