使用dpkt的微秒分辨率

时间:2014-04-15 20:06:27

标签: python

我正在尝试创建一个Python脚本,我在其中解析一个pcap文件,并将流量突发性测量到亚毫秒级别。问题是看起来dpkt提供的时间戳似乎没有提供足够好的分辨率。以下脚本     #!的/ usr / bin中/蟒蛇     import dpkt,sys

f=file(sys.argv[1],"rb")
pcap=dpkt.pcap.Reader(f)


for ts, buf in pcap:
  eth=dpkt.ethernet.Ethernet(buf)
  size = len(eth)
  print "packet size %s" % size
  print "timestamp %s" % ts

产生以下结果

数据包大小199 时间戳1397589057.04 包大小119 时间戳1397589057.04 包大小66 时间戳1397589057.04 包大小247 时间戳1397589057.04

这些数据包的实际时间戳应该具有.043549格式,该格式可以降至微秒。有谁知道如何获得完整的时间戳?

2 个答案:

答案 0 :(得分:3)

我假设您正在做这样的事情:

for ts, buf in pcap:
    print ts

然后您将时间戳记为1408173480.93而不是1408173480.936543。这是因为python限制中的print函数浮动到两位小数。

示例:

>>> x = 1258494066.119061
>>> x
1258494066.119061
>>> print x
1258494066.12

如果您确实需要打印完整值,请使用格式:

>>> "{0:.6f}".format(x)
'1258494066.119061'

答案 1 :(得分:2)

不知道这是否会对你有所帮助,但我注意到了同样的事情。对于我的要求,我更喜欢整数值而不是浮点转换。当然,为了做到以下几点,你需要来源:

它的起源来自 dpkt (版本1.8)目录中 pcap.py 中的第151行

yield (hdr.tv_sec + (hdr.tv_usec / 1000000.0), buf)

可以将其更改为以下内容,以确保返回秒和微秒的原始整数值:

yield ((hdr.tv_sec, hdr.tv_usec), buf)

元组的格式符合我的喜好,可以修改。