2

我正在解析一些非常不干净的日志,并且每个日志文件都存在于一行中。

我已经设法用正则表达式将它们分开,只留下一个奇怪的类似 HEX 的数字,它是日志字符串。我认为类似 HEX 的数字中的序列是时间戳,但我不知道如何破译它。

我想知道是否有人会看到这种模式。

513328F8003D
51332900003D
5133290C003D
5133293C003D
51332945003D
5133294E003D
51332955003D

这是几秒钟后

5134519A102B
5134519C0039
513451B0132B
513451B3102B
513451B31329
513451B3182B
513451B31A2F

在少数情况下,数字是相同的。但是在大约 28000 行上,它只发生了几次。所以我猜它每秒记录时间,因此在极少数情况下会在完全相同的时间生成编码时间戳,如下所示:

51345D391929
51345D391929
51345D3A042B

日志文件的更新时间(除了上面提到的双倍时间)是今天早上 08:45 左右。

也许这是一种奇怪的方式来表示微时间?我想不通:P

4

3 回答 3

5

首先,让我们找到 2013-03-04 08:43 GMT+1 的时间戳:

In [25]: import pytz
In [47]: gmt1 = pytz.timezone('Etc/GMT+1')

In [48]: import datetime as DT

In [49]: date = gmt1.localize(DT.datetime(2013, 3, 4, 8, 43))

In [50]: date
Out[50]: datetime.datetime(2013, 3, 4, 8, 43, tzinfo=<StaticTzInfo 'Etc/GMT+1'>)

In [51]: import calendar

In [53]: calendar.timegm(date.utctimetuple())
Out[53]: 1362390180

In [54]: hex(calendar.timegm(date.utctimetuple()))
Out[54]: '0x51346ca4'

这与您发布的十六进制字符串有很大的相似性。


因此,如果最后 4 个十六进制数字被视为小数部分,则该数字可以解释为 UTC 时间戳:

import datetime as DT
hexstamps = '''\
513328F8003D
51332900003D
5133290C003D
5133293C003D
51332945003D
5133294E003D
51332955003D
5134519A102B
5134519C0039
513451B0132B
513451B3102B
513451B31329
513451B3182B
513451B31A2F
51345D391929
51345D391929
51345D3A042B'''

for hexstamp in hexstamps.split():
    print(DT.datetime.utcfromtimestamp(float(int(hexstamp, 16))/16**4))

产生 UTC 日期时间:

2013-03-03 10:42:00.000931
2013-03-03 10:42:08.000931
2013-03-03 10:42:20.000931
2013-03-03 10:43:08.000931
2013-03-03 10:43:17.000931
2013-03-03 10:43:26.000931
2013-03-03 10:43:33.000931
2013-03-04 07:47:38.063156
2013-03-04 07:47:40.000870
2013-03-04 07:48:00.074875
2013-03-04 07:48:03.063156
2013-03-04 07:48:03.074844
2013-03-04 07:48:03.094406
2013-03-04 07:48:03.102280
2013-03-04 08:37:13.098282
2013-03-04 08:37:13.098282
2013-03-04 08:37:14.016281
于 2013-03-04T12:47:34.333 回答
3

似乎最左边的四个字节是时间戳:

In [29]: datetime.datetime.fromtimestamp(0x5134519A)
Out[29]: datetime.datetime(2013, 3, 4, 11, 47, 38)

In [30]: datetime.datetime.fromtimestamp(0x51332955)
Out[30]: datetime.datetime(2013, 3, 3, 14, 43, 33)

最右边两个字节的最大值是多少?如果它们不一致0000-FFFF,则不太可能只是小数秒。而且它们大于0x3e8,所以它们不能是毫秒。

于 2013-03-04T12:48:46.890 回答
2

看起来它们是十六进制编码的纪元时间戳(至少前 8 个字符看起来像是自纪元以来的秒数,时间戳。

lines = """513328F8003D
51332900003D
5133290C003D
5133293C003D
51332945003D
5133294E003D
51332955003D
5134519A102B
5134519C0039
513451B0132B
513451B3102B
513451B31329
513451B3182B
513451B31A2F""".split("\n")

from datetime import datetime


def convert(x):
    return datetime.utcfromtimestamp( eval("0x" + x.strip()[:-4] ) )        

for x in lines:
    print x, convert(x)

给....

513328F8003D 2013-03-03 10:42:00
51332900003D 2013-03-03 10:42:08
5133290C003D 2013-03-03 10:42:20
5133293C003D 2013-03-03 10:43:08
51332945003D 2013-03-03 10:43:17
5133294E003D 2013-03-03 10:43:26
51332955003D 2013-03-03 10:43:33
5134519A102B 2013-03-04 07:47:38
5134519C0039 2013-03-04 07:47:40
513451B0132B 2013-03-04 07:48:00
513451B3102B 2013-03-04 07:48:03
513451B31329 2013-03-04 07:48:03
513451B3182B 2013-03-04 07:48:03

我冒险猜测最后四个十六进制数字对应于数据的毫秒/微秒部分,但没有确切的值来比较我不会试图猜测它们是如何编码的。如果您对秒数感到满意,那么这可能会完成这项工作。

干杯,

一个。

于 2013-03-04T12:59:08.043 回答