3

到目前为止,我得到的是w32tm /ntpte使用 2^32 切片,从 1900/1/1 开始,到 2036/7/2 结束。根据我的计算,每个周期大约是 1 秒。不好的是,周期没有被连续枚举,一切都是基于 2 次幂的周期。 它使用 NTP 协议(​​该文档不是令人愉快的阅读)和我想得到一个时代和当前时间戳并使用 2^32 来计算所需的日期 - 但我不知道如何获取当前时间戳以及要使用哪个时代。 这里的这个人有一些启发 ,但我不能得到与他的例子相同的结果。

这里还有一个简单的例子:

c:\> w32tm /ntpte 256
0x014F37D494604000 - 109207 18:12:16.0000000 - 1.1.1900  20:12 

我也不知道这些十六进制和第二个数字是什么,但知道会很有趣。可能无法用简单的批处理来计算我需要的东西,所以如果有(在整个宇宙中)有人知道如何这是如何实现的,可以使用脚本/编程语言作为说明性示例/说明。

4

1 回答 1

4

我没有弄清楚十六进制数字的含义,但第二个数字是 ANSI 日期,即自 1601 年 1 月 1 日以来经过的天数。参数是自 1900-01-01 00:00 以来经过的秒数:00,但它有相反的字节顺序,第一个字节是最不重要的(1900-01-01 00:00:01 被编码为 0x01000000)。要让 w32tm 打印出 2013 年 1 月 15 日 22:00 UTC,请使用以下命令:

w32tm /ntpte 0xe04fa0d4

或者

w32tm /ntpte 3763314900

(从十六进制转换为十进制就好像字节顺序是正常的)。

编辑:似乎 w32tm 打印的十六进制值是一个 64 位整数,表示自 1601 年 1 月 1 日以来 100 纳秒间隔的数量。从这篇文章中,我知道这就是 Windows 存储 FILETIME 的方式。

EDIT2:在玩了一些之后,我发现了另外两件事:

  1. 传递给w32tm /ntpte的参数实际上是一个 64 位整数。正如我之前写的,最高有效 32 位表示自 1900-01-01 00:00:00 以来的秒数,而最低有效 32 位表示秒的分数。整个 64 位数字表示自 1900 年 1 月 1 日以来 1/(2 的 32 次幂)秒间隔的数量。因此0x0000008000000000等于 1900-01-01 00:00:00 之后的 1/2 秒。

  2. 打印的十六进制值w32tm /ntpte可以直接作为参数传递给w32tm /ntte

于 2013-01-15T22:44:20.940 回答