【发布时间】:2014-04-24 01:00:12
【问题描述】:
当我想通过 SNMP 获取 cablemodem 事件日志时,我 snmpwalk 'mib-2.69.1.5.8.1' oid,但我遇到了问题,因为 SNMP 将每个事件日期存储在名为“特殊”的十六进制字符串中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);
}
这是可行的,但出于某种原因,我认为这不是最优雅的解决方案。 我说的对吗?
【问题讨论】:
-
这可能是最好的方法。您可能需要考虑发布此内容,以便其他人可以从中受益。
-
谢谢@JohnConde,此代码 100% 免费;)
-
@JohnConde 检查我的答案 ;)
unpack()比你想象的更强大。