Python编写SNTP Client的一点疑问

NTP的数据格式如下:

clipboard.png

现在要在不使用第三方库的条件下,编写一个简单的SNTP Client,参考代码如下:

#!usr/bin/env python
import socket
import struct
import sys
import time

NTP_SERVER = '0.cn.pool.ntp.org'
TIME1970 = 220898800

def sntp_client():
    client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    data='\x1b'+47*'\0'
    client.sendto(data.encode('utf-8'),(NTP_SERVER,123))
    data,address=client.recvfrom(1024)
    if data:
        print('Response received from:',address)
    t=struct.unpack('!12I',data)[10]
    t-=TIME1970
    print('\tTime=%s'%time.ctime(t))

if __name__ == '__main__':
    sntp_client()

这段代码我有几个不明白的地方:

  1. data='x1b'+47*'0'是SNTP的请求消息么,这种写法是什么样的格式(16进制应该是0x?x是啥。。。或者说,我要怎么才能把data的内容输出为我可以看懂的形式)?

  2. t=struct.unpack('!12I',data)[10]中,'!12I'是什么意思?我查了一下文档,'!'表示Network(=big-edian),'I'表示int,所以这里是把data的内容(二进制字符串)按照int的方式解释,也就是转换为12个int的形式么?

阅读 4k
1 个回答
  1. xhh就是用来表示16进制
    data='x1b'+47*'0' 表示48字节的数据其中第一个字节为0x1b,后面47个字节为0x00

直接打印结果就是: 'x1bx00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00'

  1. 就是按网络字节序解析为12个int,t就是12个int 元素的tuple

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题