Как работает команда W32TM /NTPTE? Как с ее помощью отображать текущее время?

На данный момент я понял, что 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 

Я понятия не имею, что это за гексы и второе число тоже, но будет интересно узнать. Вероятно, будет невозможно рассчитать то, что мне нужно, простым пакетом, поэтому, если есть (во всей вселенной) кто-то, кто знает, как как это реализовано, можно использовать сценарий/язык программирования для иллюстративного примера/объяснения.


person npocmaka    schedule 14.01.2013    source источник


Ответы (1)


Мне не удалось выяснить, что означает шестнадцатеричное число, но второе число — это дата ANSI, то есть количество дней, прошедших с 1 января 1601 года. Параметр — это количество секунд, прошедших с 1900-01-01 00:00. :00, но имеет обратный порядок байтов, первый байт является наименее значащим (1900-01-01 00:00:01 кодируется как 0x01000000). Чтобы w32tm распечатал дату 15 января 2013 г., 22:00 UTC, используйте следующую команду:

w32tm /ntpte 0xe04fa0d4

or

w32tm /ntpte 3763314900

(преобразование из шестнадцатеричного в десятичное происходит так, как если бы порядок байтов был нормальным).

РЕДАКТИРОВАТЬ: кажется, что шестнадцатеричное значение, напечатанное w32tm, представляет собой 64-битное целое число, представляющее количество 100-наносекундных интервалов с 1 января 1601 года. Из этого статья Я знаю, что именно так Windows хранит FILETIME.

EDIT2: Еще немного поиграв, я нашел еще две вещи:

  1. Параметр, переданный в w32tm /ntpte, на самом деле является 64-битным целым числом. Как я уже писал ранее, наиболее значащие 32 бита представляют собой количество секунд, прошедших с 1900-01-01 00:00:00, а младшие 32-битные представляют доли секунды. Целое 64-битное число представляет собой количество 1/(2 в степени 32) секундных интервалов с 1 января 1900 года. Таким образом, 0x0000008000000000 равно 1/2 секунды после 1900-01-01 00:00:00.

  2. Шестнадцатеричное значение, напечатанное w32tm /ntpte, может быть напрямую передано в качестве параметра в w32tm /ntte.

person MBu    schedule 15.01.2013
comment
эй. Большое спасибо. Я поиграю с этим, чтобы проверить это, прежде чем отмечать это как ответ, но посмотрите, это работает :-) - person npocmaka; 16.01.2013
comment
это делает связь между w32tm /ntte и w32tm /ntpte более ясной — еще раз спасибо. - person npocmaka; 16.01.2013
comment
Ваше последнее редактирование дало больше поводов для размышлений :-). Эта команда: w32tm /stripchart /computer:localhost /period:1 /samples:1 /packetinfo также предоставляет 4 метки времени в 64-битных шестнадцатеричных числах (согласно их именам и документам NTP), но на первый взгляд не выглядит в том же формате, что и w32tm /ntpte . Сейчас пытаюсь понять, как они связаны. - person npocmaka; 17.01.2013
comment
Вы можете передать эти временные метки в w32tm /ntpte после изменения их порядка байтов. Например, я получаю метку времени 0xD4A22E24AD31C8CF. Чтобы w32tm /ntpte правильно отображала дату, мне нужно передать 0xcfc831ad242ea2d4 - person MBu; 17.01.2013
comment
Нет, не :-) Я только что заметил, что временные метки начинаются с D4, а значение в моем ответе заканчивается на D4. Следующие 6 бит тоже одинаковые (сравните A0 с A2). И мы уже выяснили, что порядок байтов параметра w32tm /ntpte обратный. Все это дало мне подсказку, чтобы попытаться изменить отметку времени. И бинго! - person MBu; 17.01.2013