仔细理解了Python和二进制,以及struct的用法后,发现原先解析NTP数据的方法太土了,纯手工。而且也记不住。
(见 http://blog.csdn.net/hzliyaya/article/details/51441481)
用struct的话,一行就可以解决了。如下:
s='\xda\xe5\xd0\xe5'
#原始值,从网络数据包中得到的
#方法1(推荐)
timestamp=struct.unpack('>L',s)
#s2=(3672494309L,)一步就得到结果,很简洁.'>'指使用大端模式
#方法2(复杂)
s4=struct.unpack('4B',s)
#s4=(218,229,208,229)
t1=str(hex(s4[0]))
t2=str(hex(s4[1]))
t3=str(hex(s4[2]))
t4=str(hex(s4[3]))
Temp=t1+t2+t3+t4
temp=Temp.replace('0x','')
#Temp='0xda0xe50xd00xe5',temp='dae5d0e5'
timestamp=int(temp,16)
print s5
#timestamp=3672494309
#最后是时间的转换
#通过datetime的函数,转换为datetime
dateArray = datetime.datetime.utcfromtimestamp(timestamp[0])
#上述时间上,年还需要减去70(NTP时间从1900/1/1 00:00:00开始算,而utc时间从1970年开始算)
Con_time =datetime.datetime(dateArray.year-70,dateArray.month,dateArray.day,
dateArray.hour,dateArray.minute,dateArray.second)
#最终获得设备时间:2016.5.17 17:18:29