2012-10-27 33 views
0

我有一個計劃來收集來自mikrotik路由器在c#應用程序中的網絡流量數據包(v5),我打開一個UDP端口,數據包來讀取字節數組,我通過查看包格式caligare.com來拆分數據包字節數組,因爲數據包格式字節24-27是「SysUptime at start of flow」,現在我想將這4個字節轉換爲datetime。NETFLOW數據包版本5轉換字節24-27到日期時間

例如,這4個字節是134,88,157,126 我應該怎麼做?

謝謝

回答

1

這4個字節基本上是一個32位整數。使用網絡傳輸的數據包時必須注意的是字節順序,或者Endianness。在網絡傳輸的數據包中,這些數據包的順序是大端,而英特爾x86架構是小端。這意味着數據包中的字節與機器如何存儲它們的順序相反。

這個問題已經解決了如何將網絡順序(big-endian)字節轉換爲主機順序(x86上的小端)字節:C# little endian or big endian?您需要將您已有的字節數組轉換爲Int32值爲了使用IPAddress.NetworkToHost方法:

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

相關問題