0

c# アプリで mikrotik ルーターからの netflow パケット (v5) を収集する計画があります。パケットが来るポートで udp リスナーを開き、バイト配列を読み取ります。パケット形式caligare を見て、パケットのバイト配列を分割します。 com、パケット形式のバイト 24 ~ 27 は「フロー開始時の SysUptime」であるため、この 4 バイトを日時に変換したいと考えています。

たとえば、この 4 バイトは 134 、 88 、 157 、 126 です。どうすればよいですか?

ありがとう

4

1 に答える 1

2

これらの 4 バイトは、基本的に 32 ビットの整数です。ネットワーク送信パケットを処理する際に注意する必要があるのは、バイト オーダー、つまりエンディアンです。ネットワーク送信パケットでは、これらはビッグ エンディアンとして並べられますが、Intel x86 アーキテクチャはリトル エンディアンです。これは、パケット内のバイトが、マシンが格納する方法とは逆の順序であることを意味します。

この質問には、ネットワーク オーダー (ビッグ エンディアン) バイトをホスト オーダー (x86 ではリトル エンディアン) バイトに変換する方法の回答があります: C# リトル エンディアンまたはビッグ エンディアン? IPAddress.NetworkToHostメソッドを使用するには、持っているバイト配列を Int32 値に変換する必要があります。

using System;
using System.Net;

int netSysUptimeAtStart = BitConverter.ToInt32(uptimeStartArray, 0)
int sysUptimeAtStart = IPAddress.NetworkToHostOrder(netSysUptimeAtStart)

正しい整数を取得したら、それを変換する必要がありますTimeSpan(DateTime求めているとおりではありません)。その理由は、「フロー開始時のシステム稼働時間」は実際には特定の時点ではなく、時間の範囲であるためです。

稼働時間に使用されている測定値を確認する必要があります。それはマイクロ秒ですか? 秒?その情報を使用して、これを使用して正しい TimeSpan を構築できます。

http://msdn.microsoft.com/ru-ru/library/system.timespan(v=vs.90).aspx

于 2012-10-28T21:22:29.430 に答える