Преобразование строки октета snmp в формат даты, читаемый человеком
используя структуру pysnmp, я получаю некоторые значения, выполняющие прогулку snmp. К сожалению для oid
1.3.6.1.21.69.1.5.8.1.2 (DOCS-CABLE-DEVICE-MIB)
Я получаю странный результат, который я не могу правильно напечатать здесь, так как он содержит символы ascii, такие как BEL
ACK
при выполнении repr я получаю:
Октетная строка ('x07xd8tx17x03x184x00')
но выход должен выглядеть так:
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.распаковать:
>>> 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'
Я надеюсь, что это поможет другим людям, у которых есть аналогичные проблемы, пытаясь работать с этим типом данных.