質問

When i want to get the cablemodem event log via SNMP, then i snmpwalk the 'mib-2.69.1.5.8.1' oid, but I had the problem because the SNMP store every event date in 'special' hex-string called DateAndTime format.

(In my case this is a 8 byte hex-string, like this: 07 B2 01 01 00 0A 14 00)

I would like to convert to human date, like this (1970.01.01. 00:10), so I wrote a PHP function:

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

This is work, however for some reason I think that this is not the most elegant solution. Am I right?

役に立ちましたか?

解決

For travellers from Google, in this case the device sends an 8 byte SNMP DateAndTime value without timezone information. Check the manual I've linked below. However, obtaining the timezone information follows the same principles.


Your code should look like this:

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

Output:

array(7) {
  'year' =>
  int(1970)
  'month' =>
  int(1)
  'day' =>
  int(1)
  'hour' =>
  int(0)
  'minute' =>
  int(10)
  'second' =>
  int(20)
  'decisecond' =>
  int(0)
}

Please refer to the following manual pages:

他のヒント

My solution:

function get_date($hex_string) {

    $hex_string = str_replace(" ","",$hex_string);
    $hex_string = hex2bin($hex_string);
    $arr = unpack('nyear/Cmonth/Cday/Chour/Cminute/Csecond', $hex_string);

    $year = $arr['year'];
    $month = $arr['month'];
    $day = $arr['day'];
    $hour = $arr['hour'];
    $minute = $arr['minute'];
    $second = $arr['second'];

    $date = "$year/$month/$day $hour:$minute:$second" ;
    $date = strtotime($date);

    return date('Y-m-d H:i:s', $date);

}

Result:

$hexadecimal_string = "07 E6 04 16 0D 39 35 00 2D 12 06";
$date = get_date($hexadecimal_string);
echo $date . "\n";

2022-05-19 14:31:42
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top