十六进制到/从日期时间戳
Hex to / from datetime stamp
我在 Windows 上有一个应用程序 运行,我没有源代码,GUI 将日期显示为 22/06/2018 08:44,这个 date/time 是文件中的 written/read。该文件包含日期的十六进制表示,下面是一些示例(后两个是我自己编辑的 - 因此是奇怪的年份)。
2C 05 0A D4 01 (22/06/2018 08:44)
2C 06 0A D4 01 (22/06/2018 08:51)
2C 08 11 D4 01 (01/07/2018 06:53)
B4 AE 08 D4 01 (06/12/5671 13:13)
B4 AE 11 12 10 (31/07/5270 10:53)
我正在尝试了解从十六进制到 GUI 的转换 date/time,以便我可以直接修改文件中的十六进制并相应地查看 GUI date/time
谢谢
编辑:十六进制数字是标准的 Windows 64 位值,表示自 1601 年 1 月 1 日以来 100 纳秒间隔的数量,三个最低有效位省略字节并写为小端(最低有效字节在前)。例如,您的第一个十六进制字符串 2C 05 0A D4 01 表示自 1601 年 1 月 1 日 UTC 以来 100 纳米的十六进制 01D4 0A05 2C00 0000 单位(这正好是 22/06/2018 08:44:02.9898752 UTC,但是您的GUI 省略秒和秒的小数部分)。
你可以阅读更多here: File Times on MSDN。
对于从日期和时间到十六进制的转换,例如您可以使用 http://www.silisoftware.com/tools/date.php?inputdate=2018-06-22T08%3A44%3A00%2B00%3A00&inputformat=text,输入您的日期 2018-06-22T08:44:00+00:00 并将十六进制输出为 01D40A05:2A37C800。四舍五入使其以三个零字节结尾:01D40A05:2B000000。对剩余字节重新排序:2B 05 0A D4 01.
原回答
这不是我以前见过的日期时间编码方案。从您提供的数据中,我无法推断出完整的方案。我相信我已经找到了一些计划。我不能再进一步了。
假设存在某种线性对应关系,我首先注意到,通过比较前两个样本,第二组十六进制数字(如果您愿意的话,第二个字节)相差 1 个单位,相差 7 分钟。或者大约:我们不知道时间是否有秒,甚至可能有几分之一秒没有显示。
我在与第三个样本进行比较时使用了此信息。从第一个样本到第三个样本,第三个字节增加了 7(十六进制 11 - 十六进制 0A = 7)。考虑到第二个字节的增加,似乎第三个字节的一个单位大约为 1832 分钟,这令人怀疑地接近 256 * 7 分钟 = 1792 分钟。因此,第二个和第三个字节似乎具有“小端”关系,其中第三个字节比第二个字节更重要。使用这些信息我们可以获得更准确的信息:时间差为 12849 分钟,第 2 个和第 3 个字节的差为十六进制 1108 - 0A05 = 十进制 1795,因此每个单位为 7.1582 分钟(与 7 一致分钟之前,只是它更精确)。使用此值,我从十六进制值 2C 06 0A D4 01 中插入第二个日期时间并得到 2018-06-22T08:51:09。它同意。假设得到证实!
到目前为止找到的信息足以编码 09/06/2018 14:43 (2C 00 00 D4 01) 和 01/05/2019 09:17 (2C FF FF D4 01) 之间的值精度为 7 分钟。如果这对你来说足够了,我会很惊讶。
与第 4 个样本中的值相比,第一个字节的一个单位似乎对应 14 128 940 分钟(26.86 年)。它不能很好地除以之前的 7.1582 分钟,正如我们可能希望的那样,所以我不确定我们如何使用这个观察结果。
比较最后两个样本,似乎第 4 个和第 5 个字节不能具有相同的小端顺序关系,因为第 5 个字节增加而日期减少。但是,如果我们假设至少有一年是在共同纪元(“BC”)之前,那么仍然有可能,因为纪元没有被打印出来。另一种可能性是第五个字节被忽略。这导致一个单元的第四个字节对应1 088 006分钟。同样,它与字节 2 和字节 3 的 7.15 分钟没有很好的关系,而且它可疑地接近第一个字节的单位,所以可能不正确。
要了解更多信息:首先尝试查看是否通过将(十六进制)00 00 00 00 00 编辑到文件中获得有意义的日期时间。如果这样做,接下来一次尝试一个 F:
F0 00 00 00 00
0F 00 00 00 00
…
00 00 00 00 0F
如果这不能形成足够清晰的模式,请一次尝试一位,使用十六进制数字 1、2、4 和 8 而不是 F。
我在 Windows 上有一个应用程序 运行,我没有源代码,GUI 将日期显示为 22/06/2018 08:44,这个 date/time 是文件中的 written/read。该文件包含日期的十六进制表示,下面是一些示例(后两个是我自己编辑的 - 因此是奇怪的年份)。
2C 05 0A D4 01 (22/06/2018 08:44)
2C 06 0A D4 01 (22/06/2018 08:51)
2C 08 11 D4 01 (01/07/2018 06:53)
B4 AE 08 D4 01 (06/12/5671 13:13)
B4 AE 11 12 10 (31/07/5270 10:53)
我正在尝试了解从十六进制到 GUI 的转换 date/time,以便我可以直接修改文件中的十六进制并相应地查看 GUI date/time
谢谢
编辑:十六进制数字是标准的 Windows 64 位值,表示自 1601 年 1 月 1 日以来 100 纳秒间隔的数量,三个最低有效位省略字节并写为小端(最低有效字节在前)。例如,您的第一个十六进制字符串 2C 05 0A D4 01 表示自 1601 年 1 月 1 日 UTC 以来 100 纳米的十六进制 01D4 0A05 2C00 0000 单位(这正好是 22/06/2018 08:44:02.9898752 UTC,但是您的GUI 省略秒和秒的小数部分)。
你可以阅读更多here: File Times on MSDN。
对于从日期和时间到十六进制的转换,例如您可以使用 http://www.silisoftware.com/tools/date.php?inputdate=2018-06-22T08%3A44%3A00%2B00%3A00&inputformat=text,输入您的日期 2018-06-22T08:44:00+00:00 并将十六进制输出为 01D40A05:2A37C800。四舍五入使其以三个零字节结尾:01D40A05:2B000000。对剩余字节重新排序:2B 05 0A D4 01.
原回答
这不是我以前见过的日期时间编码方案。从您提供的数据中,我无法推断出完整的方案。我相信我已经找到了一些计划。我不能再进一步了。
假设存在某种线性对应关系,我首先注意到,通过比较前两个样本,第二组十六进制数字(如果您愿意的话,第二个字节)相差 1 个单位,相差 7 分钟。或者大约:我们不知道时间是否有秒,甚至可能有几分之一秒没有显示。
我在与第三个样本进行比较时使用了此信息。从第一个样本到第三个样本,第三个字节增加了 7(十六进制 11 - 十六进制 0A = 7)。考虑到第二个字节的增加,似乎第三个字节的一个单位大约为 1832 分钟,这令人怀疑地接近 256 * 7 分钟 = 1792 分钟。因此,第二个和第三个字节似乎具有“小端”关系,其中第三个字节比第二个字节更重要。使用这些信息我们可以获得更准确的信息:时间差为 12849 分钟,第 2 个和第 3 个字节的差为十六进制 1108 - 0A05 = 十进制 1795,因此每个单位为 7.1582 分钟(与 7 一致分钟之前,只是它更精确)。使用此值,我从十六进制值 2C 06 0A D4 01 中插入第二个日期时间并得到 2018-06-22T08:51:09。它同意。假设得到证实!
到目前为止找到的信息足以编码 09/06/2018 14:43 (2C 00 00 D4 01) 和 01/05/2019 09:17 (2C FF FF D4 01) 之间的值精度为 7 分钟。如果这对你来说足够了,我会很惊讶。
与第 4 个样本中的值相比,第一个字节的一个单位似乎对应 14 128 940 分钟(26.86 年)。它不能很好地除以之前的 7.1582 分钟,正如我们可能希望的那样,所以我不确定我们如何使用这个观察结果。
比较最后两个样本,似乎第 4 个和第 5 个字节不能具有相同的小端顺序关系,因为第 5 个字节增加而日期减少。但是,如果我们假设至少有一年是在共同纪元(“BC”)之前,那么仍然有可能,因为纪元没有被打印出来。另一种可能性是第五个字节被忽略。这导致一个单元的第四个字节对应1 088 006分钟。同样,它与字节 2 和字节 3 的 7.15 分钟没有很好的关系,而且它可疑地接近第一个字节的单位,所以可能不正确。
要了解更多信息:首先尝试查看是否通过将(十六进制)00 00 00 00 00 编辑到文件中获得有意义的日期时间。如果这样做,接下来一次尝试一个 F:
F0 00 00 00 00
0F 00 00 00 00
…
00 00 00 00 0F
如果这不能形成足够清晰的模式,请一次尝试一位,使用十六进制数字 1、2、4 和 8 而不是 F。