知识大全 手动解析snmp的dateAndTime类型
Posted 字节
篇首语:百日连阴雨,总有一朝晴。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 手动解析snmp的dateAndTime类型相关的知识,希望对你有一定的参考价值。
手动解析snmp的dateAndTime类型 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
DateAndTime是Snmpv 中的一种数据类型 它主要提供了对日期时间的描述 我在使用Snmp j开发包时 发现其不提供对DateAndTime类型的支持 而有时又需要用到该类型 于是 自己写了一个方法解析该类型 可以实现对DateAndTime类型的格式化 并且可以方便地提取各时间项
下面是RFC中对DateAndTime的定义
DateAndTime ::= OCTET STRING (SIZE ( | ))
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
_____ ______ ________ _____
year
(in neork byte order)
month
day
hour
minutes
seconds
(use for leap second)
deci seconds
direction from UTC + /
(in ascii notation)
hours from UTC
minutes from UTC
Note that if only local time is known then
timezone information (fields ) is not present
由定义可见 DateAndTime仍然是OCTET STRING类型的数据 只是对每个字节进行了具体的定义 比如前两个字节表示年 第五个字节表示小时等 所以如果某个开发包中没有DateAndTime类型 那么大可以用Octet类型去代替 但是这样做得到的只是一些无意义的乱码而已 因此 实现的关键就在于按照定义对特殊的Octet数据进行正确的解析
既然DateAndTime也是Octet String 那么我们就可以按照字节数组来处理他
import java util Vector;
import apache log j Logger;
import snmp j CommandResponderEvent;
import snmp j PDU;
import snmp j smi OctetString;
import snmp j smi Variable;
import snmp j smi VariableBinding;
import diation snmp SNMPManager;
import diation util INMSLog;
public class SNMPAdapter extends SNMPManager
private Logger adapterlog = INMSLog getInstance() getAdapterLog()
private Logger recvlog = INMSLog getInstance() getReceiveLog()
public SNMPAdapter(String snmpIP String snmpPort)
super(snmpIP snmpPort)
@Override
protected void notifyMsg(CommandResponderEvent event)
( Mapper::notifyMsg》 =====NOTIFY_ALarm===== )
PDU pdu = event getPDU()
Vector vec = pdu getVariableBindings()
( YYWifiMapper::process》 oid size = + vec size())
for (int i = ; i < vec size() i++)
String oidNameValue = ;
VariableBinding vb = (VariableBinding)vec get(i)
if (vb getVariable() instanceof OctetString)
String value = new String(((OctetString)vb getVariable()) getValue())
if(vb getOid() toString() trim() equals( ) )
oidNameValue = OID: +vb getOid()+ \\t + value: + parseDateAndTime(vb getVariable())
else
oidNameValue = OID: +vb getOid()+ \\t + value: + value trim()
else
//略
public String parseDateAndTime(Variable v)
( YYWifiMapper::parseDateAndTime》 v= +v)
// ( YYWifiMapper::parseDateAndTime》 v string= +v toString())
OctetString oct = (OctetString)v;
// ( YYWifiMapper::parseDateAndTime》 v hex= + oct toHexString())
byte[] bts = oct getValue()
byte[] format_str = new byte[ ]; //保存格式化过后的时间字符串
int year;
int month;
int day;
int hour;
int minute;
int second;
int msecond;
// for(byte b:bts)
// ( YYWifiMapper::parseDateAndTime》 bts: +b)
//
year=bts[ ]* + +bts[ ]; //( YYWifiMapper::parseDateAndTime》 year: +year)
month=bts[ ];
day=bts[ ];
hour=bts[ ];
minute=bts[ ];
second=bts[ ];
msecond=bts[ ];
//以下为格式化字符串
int index= ;
int temp=year;
for( index>= ; index )
format_str[index]=(byte)( +(temp temp/ * ))
temp/= ;
format_str[ ]= ;
index= ;
temp=month;
for( index>= ; index )
format_str[index]=(byte)( +(temp temp/ * ))
temp/= ;
format_str[ ]= ;
index= ;
temp=day;
for( index>= ; index )
format_str[index]=(byte)( +(temp temp/ * ))
temp/= ;
format_str[ ]= ;
index= ;
temp=hour;
for( index>= ; index )
format_str[index]=(byte)( +(temp temp/ * ))
temp/= ;
format_str[ ]= : ;
index= ;
temp=minute;
for( index>= ; index )
format_str[index]=(byte)( +(temp temp/ * ))
temp/= ;
format_str[ ]= : ;
index= ;
temp=second;
for( index>= ; index )
format_str[index]=(byte)( +(temp temp/ * ))
temp/= ;
// format_str[ ]= ;
// index= ;
// temp=msecond;
// for( index>= ; index )
// format_str[index]=(byte)( +(temp temp/ * ))
// temp/= ;
//
//
// format_str[ ]= ;
// ( YYWifiMapper::parseDateAndTime》 format_str = + new String(format_str))
return new String(format_str)
实际运行log如下(注意值为 进制)
YYWifiMapper::parseDateAndTime》 v= :dc: : : : : b: : b: :
YYWifiMapper::parseDateAndTime》 format_str = : :
处理年的时候稍有不同 因为年是由两个字节表示 所以要用高位字节乘 再加低位字节 处理语句为year=bts[ ]* + +bts[ ];标准的时间输出格式应该为YYYY MM DD HH:MM:SS形式
其实自己用计算器就能算出时间 很简单了
主要是年的计算byte是可以为负值 所以手动计算的公式
* + dc = * + = 年 或者 * + ( + dc) = * + ( + ( )) = 年
= 月
= 日
= 时
= 分
cha138/Article/program/Java/hx/201311/26305相关参考
汽轮机启动前或停机后,用来盘动转子的装置称为盘车装置。一般可分为手动和电动盘车两种。
中医治疗白癜风是从患者整体出发,患者不能听信他人的治疗方案来进行自身的治疗,下面就让中医专家为大家解析白癜风都有哪些类型:中医专家称,中医学精髓中医辨证法是建立在科学的基础上发展而来,这种方法主要就是
中医治疗白癜风是从患者整体出发,患者不能听信他人的治疗方案来进行自身的治疗,下面就让中医专家为大家解析白癜风都有哪些类型:中医专家称,中医学精髓中医辨证法是建立在科学的基础上发展而来,这种方法主要就是
红斑狼疮是一类自身免疫系统的疾病,常常会让患者的全身呈红斑状,且病情会反复发作。这类并且多发于女性身上,严重者能渗透全身多个脏器官,因此我们来看看中医是如何解析红斑狼疮的各种类型:一、气阴两虚余热型症
红斑狼疮是一类自身免疫系统的疾病,常常会让患者的全身呈红斑状,且病情会反复发作。这类并且多发于女性身上,严重者能渗透全身多个脏器官,因此我们来看看中医是如何解析红斑狼疮的各种类型:一、气阴两虚余热型症
在同一水体里放养栖息习性不同、食性各异的异种同龄和同种异龄不同规格的鱼类,是中国池塘养鱼技术的特色和核心。混养的鱼类应为习性相关,对水质和水温(在生长季节)要求相似。混养的理想鱼类有鲢鱼、鳙鱼(上层鱼
在同一水体里放养栖息习性不同、食性各异的异种同龄和同种异龄不同规格的鱼类,是中国池塘养鱼技术的特色和核心。混养的鱼类应为习性相关,对水质和水温(在生长季节)要求相似。混养的理想鱼类有鲢鱼、鳙鱼(上层鱼
全面解析Java中的String数据类型 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 首先Str
1、固岛型白癜风:在患者脂肪堆积比较多的地方容易出现白斑,如小腹、下巴等,其他部位也会出现,病灶在很长时间里都不会发生变化,出现一些黑色素岛。造成这种外形的原因是外用刺激药过量,致病灶起泡,层层脱皮,
1、固岛型白癜风:在患者脂肪堆积比较多的地方容易出现白斑,如小腹、下巴等,其他部位也会出现,病灶在很长时间里都不会发生变化,出现一些黑色素岛。造成这种外形的原因是外用刺激药过量,致病灶起泡,层层脱皮,