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# 小端还是大端?您需要将您拥有的字节数组转换为 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

于 2012-10-28T21:22:29.430 回答