当我想通过SNMP获取cablemodem事件日志时,我会轻拍“mib-2.69.1.5.8.1' oid,但我遇到了问题,因为SNMP将每个事件日期存储在' special'十六进制字符串,称为DateAndTime格式。
(在我的例子中,这是一个8字节的十六进制字符串,如下所示:07 B2 01 01 00 0A 14 00)
我想转换为人类约会,像这样(1970.01.01.00:10),所以我写了一个PHP函数:
function hex2date( $hexstring ) {
$date = "";
$p = unpack( "H*", substr( $hexstring, 0, 2 ) ); // year (2 byte)
$date .= hexdec( $p[1] ).".";
$p = unpack( "H*", substr( $hexstring, 2, 1 ) ); // month (1 byte)
$date .= sprintf( "%02s", hexdec( $p[1] ) ).".";
$p = unpack( "H*", substr( $hexstring, 3, 1) ); // day (1 byte)
$date .= sprintf( "%02s", hexdec( $p[1] ) ).". ";
$p = unpack( "H*", substr( $hexstring, 4, 1 ) ); // hour (1 byte)
$date .= sprintf( "%02s", hexdec( $p[1] ) ).":";
$p = unpack( "H*", substr( $hexstring, 5, 1 ) ); // minute (1 byte)
$date .= sprintf( "%02s", hexdec( $p[1] ) );
return ($date);
}
这是工作,但出于某种原因,我认为这不是最优雅的解决方案。 我是对的吗?
答案 0 :(得分:3)
对于来自Google的旅行者,在这种情况下,设备会发送一个8字节的SNMP DateAndTime值,而不会显示时区信息。查看我在下面链接的手册。但是,获取时区信息遵循相同的原则。
您的代码应如下所示:
// Prepare test data
$binstring = "\x07\xB2\x01\x01\x00\x0A\x14\x00";
$values = unpack('nyear/Cmonth/Cday/Chour/Cminute/Csecond/Cdecisecond', $binstring);
var_dump($values);
输出:
array(7) {
'year' =>
int(1970)
'month' =>
int(1)
'day' =>
int(1)
'hour' =>
int(0)
'minute' =>
int(10)
'second' =>
int(20)
'decisecond' =>
int(0)
}
请参阅以下手册页: