2

非常に汚れていて、すべてがログファイルごとに1行に存在するいくつかのログを解析しています。

正規表現を使用してそれらを分解し、奇妙なHEXのような数値とログ文字列だけを残しました。HEXのような数字のシーケンスはタイムスタンプだと思いますが、それを解読する方法がわかりません。

誰かがそのパターンを見るのではないかと思っていました。

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

これは数秒後です

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

場合によっては、番号が同じになることもあります。しかし、約28000行では、数回しか発生しません。したがって、1秒あたりの時間をログに記録すると推測しているため、ごくまれに、次のように、まったく同じ時刻にエンコードされたタイムスタンプが生成されます。

51345D391929
51345D391929
51345D3A042B

ログファイルの更新時刻(上記の2倍の時刻を除く)は、今朝の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'

これは、投稿した16進文字列との有望な類似点です。


したがって、最後の4桁の16進数が小数部分として扱われる場合、その数値は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

左端の4バイトがタイムスタンプのようです。

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)

右端の2バイトの最大値はいくつですか?それらが均一0000-FFFFでない場合、それはほんのわずかな秒である可能性は低いです。また、はよりも大きいため0x3e8、ミリ秒にすることはできません。

于 2013-03-04T12:48:46.890 に答える
2

16進数でエンコードされたエポックタイムスタンプのように見えます(少なくとも最初の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

最後の4桁の16進数がデータのミリ秒/マイクロ秒の部分に対応していると推測するのは危険ですが、比較する正確な値がないと、それらがどのようにエンコードされているかを推測しようとはしません。あなたが秒に満足しているなら、これは仕事をするかもしれないように見えます。

乾杯、

A。

于 2013-03-04T12:59:08.043 に答える