在Snmp++中处理DateAndTime类型数据

C#使用DateAndTime.DateDiff方法计算年龄 命名空间:程序集:DateAndTime 模块包含在日期和时间操作中使用的过程和属性。 阅读详情

DateAndTime是Snmpv2中的一种数据类型,它主要提供了对日期时间的描述。我在使用Snmp++开发包时,发现其不提供对DateAndTime类型的支持,而有时又需要用到该类型,于是,自己写了一个DateTime类扩展Snmp++。通过该类可以实现对DateAndTime类型的格式化,并且可以方便地提取各时间项。下面就对该类进行一下介绍。

要实现DateTime类,首先要要理解DateAndTime类型的定义。下面是RFC中对DateAndTime的定义:

DateAndTime ::= OCTET STRING (SIZE (8 | 11))

   --        A date-time specification for the local time of day.

   --        This data type is intended to provide a consistent

   --        method of reporting date information.

   --

   --            field  octets  contents                  range

   --            _____  ______  ________                  _____

   --              1      1-2   year                      0..65536

   --                           (in network byte order)

   --              2       3    month                     1..12

   --              3       4    day                       1..31

   --              4       5    hour                      0..23

   --              5       6    minutes                   0..59

   --              6       7    seconds                   0..60

   --                           (use 60 for leap-second)

   --              7       8    deci-seconds              0..9

   --              8       9    direction from UTC        "+" / "-"

   --                           (in ascii notation)

   --              9      10    hours from UTC            0..11

   --             10      11    minutes from UTC          0..59

   --

   --            Note that if only local time is known, then

   --            timezone information (fields 8-10) is not present.

由定义可见,DateAndTime仍然是OCTET STRING类型的数据,只是对每个字节进行了具体的定义。比如前两个字节表示年,第五个字节表示小时等。所以如果某个开发包中没有DateAndTime类型,那么大可以用Octet类型去代替。但是这样做得到的只是一些无意义的乱码而已。因此,实现的关键就在于按照定义对特殊的Octet数据进行正确的解析。

既然DateAndTime也是Octet String,我们就通过Snmp++的OctetStr类继承得到类DateTime。这样,提取数据等底层工作都可以交给Snmp++,它会按照Octet String的得到方法原始数据。在Snmp++中,所有的SMI数据类型都有一个get_printable函数,它返回一个格式化好的字符串供程序打印输出等。该函数是一个虚函数,各个具体的类有不同的实现方法。如果我们直接调用OctetStr类的get_printable函数来输出DateAndTime类型数据,就会像前面所述的一样得到乱码,因此我们要重写该函数。另外,每个SMI数据类型类还有一个get_syntax函数,它返回一个32位整数,表示当前的数据类型的代码,它也是一个虚函数,同样需要重写。

下面我们来看一看DateTime类的定义:

 

#include "../snmp_include/octet.h"

 

#define sNMP_SYNTAX_DATETIME   (aSN_APPLICATION | aSN_PRIMITIVE | 0x09)

 

/*this class implement the DateAndTime type defined in Snmpv2,

  the oringinal snmp++ doesn't directly support this type*/

class DateTime:public OctetStr{

   char format_str[128];   //保存格式化过后的时间字符串

   int year;

   int month;

   int day;

   int hour;

   int minute;

   int second;

   int msecond;

public:    

   int get_year();

   int get_month();

   int get_day();

   int get_hour();

   int get_minute();

   int get_second();

   int get_msecond();

   void format();

   //the virtual function overwrite get_printble in class OctetStr

   SmiUINT32 get_syntax();

   char  *get_printable();

};

其中format_str保存格式化过后的字符串,以后调用get_printable函数时都会返回这个字符串。其余数据项按其名字即知表示年月等时间项,并且都有一个对应的get函数来得到其值。#define sNMP_SYNTAX_DATETIME (aSN_APPLICATION | aSN_PRIMITIVE | 0x09)是对这个数据类型的代码的定义,一般来说,应该将这一行放在smi.h头文件中。定义了这个数字过后,就要修改get_syntax()函数,将其重载为:

SmiUINT32 DateTime::get_syntax()

{

   return sNMP_SYNTAX_DATETIME;

}

在成员函数中,最重要的是format()函数,它将实现各时间项数据的解析和对原始字符串的格式化。下面是其实现:

void DateTime::format(){
           //以下为提取时间数据

   char *pbuf=(char *)this->data();

   char buf[10];

   for(int i=0; i<10; i++){

      buf[i]=0;

   }

   strcpy( buf ,pbuf);

   year=buf[0]*256+256+buf[1];

   month=buf[2];

   day=buf[3];

   hour=buf[4];

   minute=buf[5];

   second=buf[6];

   msecond=buf[7];

  
          //以下为格式化字符串

   int index=3;

   int temp=year;

   for(; index>=0; index--){

      format_str[index]=48+(temp-temp/10*10);

      temp/=10;

   }

   format_str[4]='-';

   index=6;

   temp=month;

   for(; index>=5; index--){

      format_str[index]=48+(temp-temp/10*10);

      temp/=10;

   }

   format_str[7]='-';

   index=9;

   temp=day;

   for(; index>=8; index--){

      format_str[index]=48+(temp-temp/10*10);

      temp/=10;

   }

   format_str[10]=',';

   index=12;

   temp=hour;

   for(; index>=11; index--){

      format_str[index]=48+(temp-temp/10*10);

      temp/=10;

   }

   format_str[13]=':';

   index=15;

   temp=minute;

   for(; index>=14; index--){

      format_str[index]=48+(temp-temp/10*10);

      temp/=10;

   }

   format_str[16]=':';

   index=18;

   temp=second;

   for(; index>=17; index--){

      format_str[index]=48+(temp-temp/10*10);

      temp/=10;

   }

   format_str[19]='.';

   index=21;

   temp=msecond;

   for(; index>=20; index--){

      format_str[index]=48+(temp-temp/10*10);

      temp/=10;

   }

   format_str[22]=0; 

}

在处理过程中,由于各位字节就是一个数字,所以处理也比较简单,只需直接将对应字节赋值给其所表示的数字即可,比如要得到月就用month=buf[2]。只有处理年的时候稍有不同,因为年是由两个字节表示,所以要用高位字节乘256再加低位字节,处理语句为year=buf[0]*256+256+buf[1]。

标准的时间输出格式应该为YYYY-MM-DD,HH:MM:SS.MM形式,因此经过处理过后的format_str字符串中将存储这种格式的时间字符串。具体将数字转化为字符的代码见上面,这里就不再解释了。要说明的是对于这段代码可以用数字字符串转换函数将其简化。

处理完数据后,就可以重载get_printable()函数了,因为不能确定每次调用该函数时数据是否已经更新,所以在返回值之前都要先调用format格式化一下。

char  *DateTime::get_printable()

{

   format();

   return format_str;

}

由此,我们就得到了一个比较完整的DateTime类。经测试,证明能正确运行。比如下面是我得到的某台机器上软件安装表的一行数据:

hrSWInstalledIndex:41

hrSWInstalledName:Java 2 SDK, SE v1.4.2_01

hrSWInstalledType:4

hrSWInstalledDate:2004-07-01,19:29:50.00

可见,使用该类就可以正确地解析DateAndTime类型的数据。通过扩展,我们还可以生成更多的Snmp++不直接支持的数据类型,这也是面向对象技术中继承特性带给我们的好处之一吧。

SNMP(简单网络管理协议)详解 SNMP(简单网络管理协议):专门用于在 IP 网络管理网络节点(服务器、工作站、路由器、交换机及HUBS等)的一种标准协议,它是一种应用层协议。SNMP 使网络管理员能够管理网络效能,发现并解决网络问题以及规划网络增长。通过 SNMP 接收随机消息(及事件报告)网络管理系统获知网络出现问题。........................ 阅读详情

相关推荐

在Ubuntu 22.04上从零搭建FVCOM环境:手把手搞定Linux、Intel编译器与NetCDF库

本文详细指导在Ubuntu 22.04上从零搭建FVCOM环境,涵盖Linux系统配置、Intel编译器安装、NetCDF库编译及常见问题解决。通过手把手教程,帮助科研人员高效完成水动力数值模拟环境的部署,特别适合水环境研究领域的初学者。

weixin_30613727的博客 651

snmp 工具_0605-5.16.1-CM告警SNMP中DateAndTime类型解析

作者:唐辉1.文档编写目的Fayson在前面的文章《0259-如何通过Cloudera Manager配置使用SNMP方式转发告警》和《0372-CM告警SNMP对接补充》介绍了使用SNMP的方式对接,对接SNMP告警时CM提供了告警的MIB文件,对于MIB文件中的每个OID的含义以及如何使用工具查看MIB文件,找到告警的各个指标。本篇文章Fayson主要介绍SNMP 中的DateAndTime ...

weixin_39633891的博客 365

DFT知识点扫盲——DFT scan chain

实际在项目中synccell一般直接上ULVT,既然是SDF,就是带Scan接口的DFF,SN (set negtive)是低置位,RP(reset positive)是高复位,既没有SN也没有RP的就是无复位寄存器。1:定义:满足可测试性设计(DFT),将设计中所有的触发器连接到一条或者若干条链上,称为scan chain,将一个复杂的时序电路转换为简单的组合电路进行测试,这一步是在逻辑综合(DC)中实现。当SE=1当SI=1时,电路进入scan状态,当SI=0时,电路工作在normal状态。

笨蛋大乌龟的博客 4941

0605-5.16.1-CM告警SNMP中DateAndTime类型解析

Fayson的github: https://github.com/fayson/cdhproject 推荐关注微信公众号:“Hadoop实操”,ID:gh_c4c535955d0f 1 文档编写目的 Fayson在前面的文章《如何通过Cloudera Manager配置使用SNMP方式转发告警》和《CM告警SNMP对接补充》介绍了使用SNMP的方式对接,对接SNMP告警时CM提供了告警的MI...

Hadoop_SC的博客 465

【温室气体】GOSAT 数据产品

【温室气体】GOSAT 数据产品

WW、forever的博客 238

pandas教程:2012 Federal Election Commission Database 2012联邦选举委员会数据库

里面包含了支持者的名字,职业和雇主,地址,赞助金额。我们可以已经能想到如何切割、整理数据,来提取赞助者的统计数据,或提取宣传活动的模式,这里我们展示一些不同的分析方法。可以看到有些职业是同一种工作类型,指代的是同一个东西。这两个连续操作是分别独立执行的,一个结束后,另一个才开始。上,这里我是把数据集压缩成了ZIP格式,解压后能正常导入)。我觉得也有必要好好了解一下,这个网站做了很好的讲解,),所以我们最好添加这样的信息。这样的情况,即把两个索引操作连在一起。,发现映射关系被正常执行了,所以这里的。

Cachel Wood的博客 351

SnmpSharpNet OctetString DateAndTime自定义解析

在进行有关Snmpsharpnet的编程时遇到一个问题,当OctetString向时间转换时产生的是乱码。是因为snmpsharpnet并没有定义OctetString向datetime转换的函数。经过笔者的学习与实践找到了解决的办法。接下来以获得计算机上已安装程序的安装时间为例:   using System; using System.Collections.Generic; using...

WN-YoungKun的博客 2201

手把手教你学Simulink实例:基于Simulink的超级电容器充放电仿真

超级电容器(Supercapacitor)是一种高容量电容器,具有快速充放电能力、长寿命和高功率密度等优点。它在能量存储系统、电动汽车、不间断电源(UPS)等领域有广泛应用。为了更好地理解和设计超级电容器的应用系统,通常需要进行详细的仿真分析。Simulink 提供了一个强大的仿真环境,可以用来设计、分析和验证超级电容器充放电系统的控制策略。本教程将详细介绍如何使用 Simulink 进行超级电容器充放电的仿真实例。通过本教程,我们详细介绍了如何使用 Simulink 进行超级电容器充放电的仿真实例。

MHD0815的博客 581

net-snmp的dateandtime数据类型

net-snmp的dateandtime数据类型 2015/06/12 16:35:59 DateAndTime是Snmpv2中的一种数据类型,它主要提供了对日期时间的描述。 在开发一个snmp相关程序的时候,碰到了这个东西。 本文由乌合之众瞎写http://www.cnblogs.com/oloroso 原由 在开发的时候,某个节点的值是DateAndTime类型的,因为是通过挂载脚本来获取的值...

weixin_33897722的博客 186

静态代码审计插件 snyk 使用教程

静态代码审计插件 snyk 使用教程

SHELLCODE_8BIT的博客 2006

云计算 | 期末梳理(上)

2024云计算回忆版 && 复盘向梳理

知识库搭建ing 2233

SNMP编程基础

 (-----引自天极网,个人收藏)SNMP(Simple Network Management Protocol)是简单网络管理协议,主要用来管理网络设备,正因为“简单”,所以其发展很快,到目前为止几乎所有的网络产品都要为其提供支持,以方便管理员的管理和软件开发人员的开发。在这里我们不对有关SNMP的概念和基础知之作过多地阐述,一且假定你对其工作原理有了一定的了解,而仅缺的是如何去实

小宇飞刀的BLOG 1564

YOLOv8 交通违规检测各个场景的实际应用

本文介绍了基于YOLOv8的交通违规检测系统在不同场景下的应用实现。系统可检测闯红灯、超速、违停和不系安全带等多种违规行为,针对每种场景提供了具体的技术方案和Python实现代码。其中闯红灯检测结合信号灯状态分析,超速检测通过距离时间计算速度,违停检测采用长时间跟踪策略,安全带检测则需更高精度识别。文章还展示了如何整合各功能构建综合交通监管系统,并总结了不同应用场景的技术要点和优化方向,为智能交通管理提供了实用解决方案。

u010117029的博客 301

在Snmp++中处理DateAndTime类型数据 选择自 makeitandy 的 Blog

 DateAndTime是Snmpv2中的一种数据类型,它主要提供了对日期时间的描述。我在使用Snmp++开发包时,发现其不提供对DateAndTime类型的支持,而有时又需要用到该类型,于是,自己写了一个DateTime类扩展Snmp++。通过该类可以实现对DateAndTime类型的格式化,并且可以方便地提取各时间项。下面就对该类进行一下介绍。要实现DateTime类,首先要要理解DateAn

trunk 3285

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

PHP 转换snmp的时间格式

function convert_snmp_timeticks($timeticks) { if(!is_numeric($timeticks)) { return FALSE; } //如果是字符串类型,则先进行转换 if(is_string($timeticks)) { $timeticks = int...

weixin_34033624的博客 197

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Python将 snmp 八位字节字符串转换为人类可读的日期格式

https://stackoverflow.com/questions/4571899/convert-snmp-octet-string-to-human-readable-date-format 使用 pysnmp 框架,我通过 snmp walk 得到了一些值。不幸的是对于oid 1.3.6.1.21.69.1.5.8.1.2(文档-电缆-设备-MIB) 我得到一个奇怪的结果,我无法在这里正确打印,因为它包含像这样的 ascii 字符BELACK 做repr时,我得到: ...

allway2的博客 1214

14、Date and Time (日期和时间)

文章目录(一)Note1、java.util.Date1.1、字段1.2、构造1.3、类方法1.4、实例方法1.5、子类1.6、缺点2、java.util.Calendar2.1、日历字段2.2、类方法2.3、实例方法2.4、缺点3、时区和地区4、java.text.DateFormat5、java.time.ZoneId6、java.time.LocalDate7、java.time.LocalTime8、java.time.LocalDateTime9、java.time.ZonedDateTime10

ourwheel的博客 3508

SNMP数据类型

<br /><br />SNMP数据类型<br /> <br />数据类型共分为三大类,即:<br /> <br />(1)通用类型(Universal)<br /> <br />(2)通用结构类型(Universal-constructed)<br /> <br />(3)应用类型(application)<br /> <br />●通用数据类型<br /> <br />通用数据类型通常被称为非聚合类型,在SNMP协议中有4种通用数据类型:<br /> <br />(1)INTEGER: 整型,是-2,1

ddxkjddx的专栏 5769

C#调用DateAndTime

由于DateAndTime类定义在Visual Basic 的程序集中,所以在使用DateAndTime类前,首先要引用Visual Basic 程序集,并添加Microsoft.VisualBasic 命令空间。 我们通常使用DateAndTime类的DateDiff方法计算时间间隔。必须在资源管理栏中加入一个(Microsoft.VisualBasic)的引用,方法:在资源管理器中的引用点击右键,选择添加一个引用,最后找到这个引用就可以了,如下图红色框内所示。 ...

511遇见 2474

snmp mib 数据类型

SNMP Overview SNMP Overview What Is an Agent? Who Is a Manager? Manager and Agent Relationship What Is a MIB? What are MIB Groups? MIB Datatypes Available MIB

twinkle_star1314的博客 9010

终于明白了snmp++网络

snmp++自带的例子如何编译:这里 编译过程是如下: 1,vc++编译,生成exe文件。 2,cmd找到上一步生成的exe的路径,再输入exe的文件名,按照提示输入参数 下面以编绎snmpWalk为例: 1,把自带的例子snmpWalk源码拷贝到vc++建立的命令行工程D:Test(自己定义) 2,修改commnity成目标交换机的newPublic 3,编译Test生成Text.

杨远的专栏 2001

JavaScript日期时间处理库:date-and-time快速入门与实战指南

JavaScript日期时间处理库:date-and-time快速入门与实战指南 项目介绍 date-and-time 是一个极简主义的日期时间处理工具,专为Node.js和浏览器设计。它追求小巧、简洁、易学的特点,在现代JavaScript开发环境中,许多模块变得庞大且依赖复杂,本库专注于提供轻量级解决方案,尤其是对位于依赖链底层的日期时间处理来说尤为重要。特性包括:约2KB的压缩代码大小、插件...

gitblog_01100的博客 708
上一篇: 使用Snmp++获取MIB表
下一篇: 今天在书店碰见候捷老师了:)
makeitandy
博客等级 码龄25年 2粉丝 20原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值