Шестнадцатеричная строка SNMP даты и времени преобразуется в человеческую дату в PHP


Когда я хочу получить журнал событий cablemodem через SNMP, я использую oid "mib-2.69.1.5.8.1", но у меня возникла проблема, потому что SNMP хранит каждую дату события в "специальной" шестнадцатеричной строке с именем Дата и время формат.

(В моем случае это 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);
}

Это работа, однако по какой-то причине я думаю что это не самое элегантное решение. Я прав?

Author: dbndhjefj, 2014-04-23

1 answers

Для путешественников из Google в этом случае устройство отправляет 8-байтовое значение даты и времени SNMP без информации о часовом поясе. Проверьте руководство, которое я привел ниже. Однако получение информации о часовом поясе следует тем же принципам.


Ваш код должен выглядеть следующим образом:

// 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)
}

Пожалуйста, обратитесь к следующим страницам руководства:

 3
Author: hek2mgl, 2014-04-23 17:00:12