nocproject.org
10:46
и библиотека snmp ведь неготова была к большим пакетам...
10:47
много данных не влазячт в 7 бит кодирования длины сообщения - трейс вам NotImplementedError
10:51
15:03
15:03
а то протухнет через месяц
15:15
это где такое?
15:16
в графите тот кусок запатчен по-другому
15:19
ну я графит дергал давно, мож уже и запатчено, не проверял
15:40
покажи diff с оригинальной версией
15:41
что правил-то?
15:54
от @todo до #raise NotImplementedError()
15:55
а то больше 3 оидов нельзя было в snmpget pdu засунуть, в 127 байт не влазило :)
15:56
там много лишнего, я это прекрасно понимаю, говнокод, короче, но дело делает
15:59
lenhex="%04X"%l
15:59
octs=int(len(lenhex)/2)
15:59
это ты со зла
15:59
количество октетов считаешь?
15:59
да, причем зря.
16:00
хотя не, не зря
16:00
надо же число байтов +128 первым вписать, а потом длину
16:00
linhex всегда у тебя == 4
16:00
:)
16:00
мда?
16:01
а ты уверен, или так, неподумав, сказал?
16:01
>>> "%04X" % 0
16:01
'0000'
16:01
>>> "%04X" % 500
16:01
'01F4'
16:02
>>> s="%04X"% 123456789
16:02
>>> s
16:02
'75BCD15'
16:02
16:02
как видишь, не всегда
16:02
при том, что это длина
16:02
первый случай обходится условием выше по тексту
16:03
хотя может я и неправ где-то :)
16:03
я же не настоящий сварщик
16:04
но в целом да, длина может быть больше 127, при этом будет занимать один байт, а я займу два, кто-то из катез может и не понять меня
16:04
китаёз*
16:05
def parse_length(self, msg):
16:05
v = ord(msg[0])
16:05
if v & 0x80:
16:05
# Long form
16:05
l = v & 0x7f
16:05
v = 0
16:05
for c in msg[1:1 + l]:
16:05
v += (v << 8) + ord(c)
16:05
return v, msg[1 + l:]
16:05
else:
16:05
# Short form
16:05
return v, msg[1:]
16:05
в обратную сторону у нас так
16:08
n = 0
16:08
while i:
16:08
n += 1
16:08
i >>= 8
16:08
я думаю, лучше как-то так считать
16:09
токмо дальше мне один хрен проще из hex string выковырять int, чем мучаться с делениями и остатками :)
16:10
а так - да
16:11
однако опять же я дергаю не меньше 10 оидов с железяки, там длина больше 256, так что два байта имею, поправлю на селдующей неделе
16:13
не
16:13
все не так
16:16
16:16
вот так веселее
16:16
;)
16:18
то есть не было у тебя длинной формы encode_tlv
16:18
а нахрен лишний модуль дергал?
16:19
а ты посмотри, там все на нем
16:19
struct.pack размазывает число в строку с октетами
16:19
и тут же срезаем нули слева
16:20
просто периодически вижу твою сильную любовь к дополнительным модулям, думаю, а чо собственную реализацию не забабахал?
16:20
шутка, если чо
16:22
так... а эта вундервафля нормально отработает, если длина данных будет в диапазоне 128-255?
16:23
по идее должна будет выдать 0xF1 и один байт этой самой длины
16:25
да
16:25
struct -- стандартный модуль
16:25
и много где используется
16:27
>>> struct.pack("!Q", 129).lstrip("\x00")
16:27
'\x81'
16:27
>>> struct.pack("!Q", 300).lstrip("\x00")
16:27
'\x01,'
16:27
>>> struct.pack("!Q", 1000).lstrip("\x00")
16:27
'\x03\xe8'
16:27
не
16:28
если длина 129, то на выходе должны быть 0x81 0x81. Первое показывает, что длина больше 127 и сколько байт следом за ней собсно длина
16:28
а второе уже будет длина =)
16:29
стоп
16:29
или не стоп?
16:30
короче, для 129 на выходе должны быть два байта, для 500 должно быть три байта на выходе
16:30
а, всё
16:31
простите, дяденька, к концу рабочего дня туплю
Share this page
Share this page: