【发布时间】:2017-07-04 22:25:36
【问题描述】:
我问这个问题是为了学习。
看看我刚刚在wireshark上捕获的这个udp数据包:
(这是 time.windows.com 的回复,以便将时间分配给我的计算机)
无论如何,我的问题是关于突出显示的最后 8 个字节。请注意 Wireshark 如何正确解析日期。 time.windows.com 是如何生成这 8 个字节的?如何从DateTime.NowUtc 转到wireshark 将解析为正确日期的内容?
我试过了:
long dateTime = DateTime.Now.ToFileTimeUtc();
var bytes = BitConverter.GetBytes(dateTime);
但是当我发送这 8 个字节时,wireshark 将该日期解析为“4/15/1998 11:27:52 AM”,这已经很遥远了。
自 1970 年以来,我也尝试添加毫秒,但仍然显示错误的日期。
编辑
以下是有关如何解析响应的示例: http://davidnakoko.com/2013/07/c-get-network-time-from-ntp-server/
但是我在哪里可以找到有关如何创建它的示例?
解决方案
感谢@adjan 和@RayFischer 的回答,我想出了一个解决方案。这里是:
public static byte[] ConvertToNtp(DateTime datetime)
{
ulong milliseconds = (ulong)((datetime - new DateTime(1900, 1, 1)).TotalMilliseconds);
ulong intpart = 0, fractpart = 0;
var ntpData = new byte[8];
intpart = milliseconds / 1000;
fractpart = ((milliseconds % 1000) * 0x100000000L) / 1000;
//Debug.WriteLine("intpart: " + intpart);
//Debug.WriteLine("fractpart: " + fractpart);
//Debug.WriteLine("milliseconds: " + milliseconds);
var temp = intpart;
for (var i = 3; i >= 0; i--)
{
ntpData[i] = (byte)(temp % 256);
temp = temp / 256;
}
temp = fractpart;
for (var i = 7; i >= 4; i--)
{
ntpData[i] = (byte)(temp % 256);
temp = temp / 256;
}
return ntpData;
}
【问题讨论】:
标签: c# datetime binary utc ntp