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