Преобразовать строку октета snmp в читаемый человеком формат даты

Используя фреймворк pysnmp, я получаю некоторые значения, делая snmp walk. К сожалению для oid

1.3.6.1.21.69.1.5.8.1.2 (DOCS-CABLE-DEVICE-MIB)

я получаю странный результат, который я не могу правильно напечатать здесь, так как он содержит символы ascii как BELACK

Делая repr я получаю:

OctetString ('\ X07\xd8\ т \x17\x03\x184\x00')

Но вывод должен выглядеть так:

2008-9-23,3: 24: 52,0

формат называется "DateAndTime". Как я могу перевести вывод OctetString в "удобочитаемую" дату / время?

3 ответа

Решение

Формат здесь.

A date-time specification. 
            field  octets  contents                  range
            -----  ------  --------                  -----
              1      1-2   year*                     0..65536
              2       3    month                     1..12
              3       4    day                       1..31
              4       5    hour                      0..23
              5       6    minutes                   0..59
              6       7    seconds                   0..60
                           (use 60 for leap-second)
              7       8    deci-seconds              0..9
              8       9    direction from UTC        '+' / '-'
              9      10    hours from UTC*           0..13
             10      11    minutes from UTC          0..59
* Notes:
            - the value of year is in network-byte order
            - daylight saving time in New Zealand is +13 For example, 
              Tuesday May 26, 1992 at 1:30:15 PM EDT would be displayed as:
                 1992-5-26,13:30:15.0,-4:0 
              Note that if only local time is known, then timezone
              information (fields 8-10) is not present.

Вы можете использовать struct.unpack:

>>> import struct, datetime
>>> s = '\x07\xd8\t\x17\x03\x184\x00'
>>> datetime.datetime(*struct.unpack('>HBBBBBB', s))
datetime.datetime(2008, 9, 23, 3, 24, 52)

@Paulo Scardine: Это был лучший ответ, который я нашел в Интернете, когда работал над решением очень похожей проблемы. Мне все еще потребовалось некоторое время, чтобы решить мою проблему даже с этим ответом, поэтому я хотел опубликовать последующий ответ, который может добавить больше ясности. (особенно проблема с датой, имеющей различные варианты длины).

Следующий фрагмент кода подключается к серверу и захватывает системное время, а затем выводит его в виде строки для иллюстрации метода.

import netsnmp
import struct
oid = netsnmp.Varbind('hrSystemDate.0')
resp = netsnmp.snmpget(oid, Version=1, DestHost='<ip>', Community='public')
oct = str(resp[0])
# hrSystemDate can be either 8 or 11 units in length.
oct_len = len(oct)
fmt_mapping = dict({8:'>HBBBBBB', 11:'>HBBBBBBcBB'})
if oct_len == 8 or oct_len == 11:
    t = struct.unpack(fmt_mapping[oct_len], oct)
    print 'date tuple: %s' % (repr(t))
else:
    print 'invalid date format'

Я надеюсь, что это помогает другим людям, у которых есть подобные проблемы, пытаясь работать с этим типом данных.

Бесстыдная заглушка здесь: модули Pycopia SNMP и SMI правильно обрабатывают этот объект, а также другие. Pycopia устанавливается из исходного кода, и не забывайте файл MIBS, если вы попробуете его.

Другие вопросы по тегам