【问题标题】:SNMP DateAndTime hex-string convert to human date in PHPSNMP DateAndTime 十六进制字符串在 PHP 中转换为人类日期
【发布时间】: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() 比你想象的更强大。

标签: php date snmp


【解决方案1】:

对于来自 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)
}

请参考以下手册页:

【讨论】:

  • 是的,我知道时区信息丢失了,但我只从调制解调器获得了这么多数据。我会试试你的版本,但我认为你的 $hextime 变量并不是函数的真正十六进制输入。
  • 我猜你错过了说你正在使用二进制数据而不是你在问题中发布的十六进制字符串。不是吗?如果您正在处理二进制数据,则只需一个 unpack 调用,不需要 substr 和 hexdec。让我知道我对您的意见是否正确。那我就在这里展示如何正确使用 unpack。
  • 是的,正如您所说,输入是十六进制(二进制)数据,因此您的版本不起作用。
  • 这里是 snmpwalk 输出,我就是这么命名的(十六进制字符串)。 SNMPv2-SMI::mib-2.69.1.5.8.1.3.33 = 十六进制字符串:07 B2 01 01 00 00 1E 00。抱歉
  • 当我准备一些东西时,你可以看看我写的一个 hexdump 库。我相信它会对你有所帮助。 github.com/metashock/Hexdump
猜你喜欢
  • 2020-11-07
  • 2018-01-31
  • 2013-02-07
  • 1970-01-01
  • 2018-01-22
  • 2022-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多