2017-10-11 1 views
0

私はpcapngファイルを解析するパーサーを書いています(ワイヤーシャークのpcap次世代ファイル)。このためのソリューションはありますが、NPMエコシステム内に存在するソリューションを見つけることはできませんでした。だから、私は自分自身を回転させることに決めました。これまでのところうまく動作し、私は正常にすべての異なるブロックを解読することができます。Nodejs - 2つの32ビットワードの日付を計算するためにjavascriptを使用します。

現在ノード6.11を使用しています。

私は、強化されたパケットブロックのタイムスタンプを決定することに苦労しています。

0     1     2     3 
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
    +---------------------------------------------------------------+ 
0 |     Block Type = 0x00000006     | 
    +---------------------------------------------------------------+ 
4 |      Block Total Length      | 
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
8 |       Interface ID       | 
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
12 |      Timestamp (High)      | 
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
16 |      Timestamp (Low)      | 
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
20 |     Captured Packet Length      | 
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
24 |     Original Packet Length      | 
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
28/               /
/      Packet Data      /
/   variable length, padded to 32 bits    /
/               /
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
/               /
/     Options (variable)      /
/               /
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
    |      Block Total Length      | 
    +---------------------------------------------------------------+ 

タイムスタンプ(ハイ)とタイムスタンプ(低):上位32ビットと下位64ビットのタイムスタンプの32ビットドキュメントあたり、これはEHPを含むものです。タイムスタンプは、1970年1月1日00:00:00 UTCから経過した時間単位の数を表す単一の64ビット符号なし整数です。時間単位の長さは、このパケットによって参照されるインタフェース記述ブロックの 'if_tsresol'オプション(図10を参照)によって指定されます。拡張パケットブロックのタイムスタンプは、libpcapファイル形式のタイムスタンプとは異なり、1970-01-01 00:00:00 UTC以降に経過した秒とマイクロ秒を表す2つの32ビット値として保存されないことに注意してください。拡張パケットブロックのタイムスタンプは、1つの64ビット数の上位32ビットを表す2つの32ビットワードとして保存されます。

ここでタイムスタンプを調べるにはどうすればよいですか?明らかに、これは2つの32ビットワードで構成され、64ビットの数値を作成します。しかし、javascriptは64ビットintを処理しません。

私はnode-int64を使用しようとしましたが、失敗しました。結果はinfinityです。このバッファは(高い実際にタイムスタンプの最初の4バイトである

Uint8Array[8] 
0:46 
1:89 
2:5 
3:0 
4:9 
5:12 
6:15 
7:31 

をし、それが進表現だ...

timeBuffer.toString('hex') 
"2e590500090c0f1f" 

:ここ

は、私が使用しているバッファの特定のスライスであります)、バイト4-8はタイムスタンプ(低)です。

私は実際にここで実際のタイムスタンプを決定しようとしています。私は例えば数値をnew Date(12345678789)に渡すことでそうすることができます。これが格納されている方法で私の頭を包むことはできません。誰かが2つの32ビットワードを取って、それを一緒に接着して、1970年以来の時間を引き出すことができますか?

答えて

0

右は、64ビットintをサポートしていませんが、いつでも浮動小数点数を使用できます。マイクロ秒の部分は、丸め誤差に正確ではありませんが、あなたは唯一のミリ秒の分解能を持つ標準JS日付、後にしていることから、これが問題になることはありません。

buf = Buffer.from("2e590500090c0f1f", 'hex') 

h = buf.readUInt32LE(0); 
l = buf.readUInt32LE(4); 

t = h * 0x100000000 + l; 

console.log(new Date(t/1000)); // 2017-09-14T22:51:48.000Z 

あなたの他のソリューションにはありません64ビット数はビッグエンディアン(最上位部)に格納され、その部分(32ビットワード)はリトルエンディアンに格納されます。

+0

endiannessを指摘してくれてありがとう!間違いなく紛らわしい。マイクロ秒を保存する方法はありませんか?私たちのwiresharkのキャプチャには、マイクロ秒(12.003997)まで時間が保存されています。 JavaScriptブロックでパケットブロックを解析することでこれを把握できると便利でしょう。 – dvsoukup

+0

上記のコードでは、 't%1000'はμsを返しますが、これは不正確になります。 – georg

+0

よかった!私は今日少し後でこれをチェックします。あなたのお手伝いをありがとうございました。 – dvsoukup

関連する問題