Форум сайта python.su
0
Необходимо сформировать пакет вручную и отправить его на сервер.
Отредактировано protagonist113 (Сен. 30, 2012 17:13:54)
Офлайн
173
http://wiki.python.org/moin/BitManipulation
https://code.google.com/p/python-bitstring/ - должно подойти
Хотя можно обойтись struct.pack() и бинарной арифметикой.
Офлайн
0
reclosedevспасибо
v='0.2456' f1=0 f2=1 adr='123' w0=pack(">5sbb9s",v,f1,f2,adr)
Отредактировано protagonist113 (Сен. 29, 2012 18:14:21)
Офлайн
173
protagonist113А вы не путаете биты с байтами? Этот код не соответствует первоначальному вопросу.
То есть, насколько я понял первое слово будет вида?
import struct def packet_hash(packet): return sum(struct.unpack('<%dH' % (len(packet)//2), packet)) & 0xFFFF def create_packet(version, flag1, flag2, address, message): first_word = (version << 11) | (flag1 << 10) | (flag2 << 9) | address packet = struct.pack('<HH%ds' % len(message), first_word, len(message), message) return packet + struct.pack('<H', packet_hash(packet)) print repr(create_packet(0x12, 1, 0, 0x1234, 'test')) # '4\x96\x04\x00test\x1fp'
Отредактировано reclosedev (Сен. 29, 2012 18:40:23)
Офлайн
0
reclosedevспасибо
Офлайн
0
А как выровнять строку до двух байт?
так?
if len(a)%2==1:
Отредактировано protagonist113 (Сен. 30, 2012 04:40:20)
Офлайн
173
protagonist113Да. Кстати, struct.pack может сам нулевые байты добавить если указать длину больше.
А как выровнять строку до двух байт?
так?if len(a)%2==1:
... message_len = len(message) + len(message) % 2 packet = struct.pack('<HH%ds' % message_len, first_word, message_len, message) ...
Офлайн
0
reclosedevСлова считаются как целые 16-разрядные
Офлайн
0
reclosedev, разрешите мы Вас еще помучаем
. При распаковке готового пакета Питон ругается на выравнивание до 4 байт:
Пакет формируется так
str = "some string" strLength = len(str) needPadding = strLength & 3 if needPadding: strLength += 4 - needPadding packet = struct.pack(">i%ds" % strLength, strLength, str)
size = int(struct.unpack(">i", packet))
unpack requires a string argument of length 4
Отредактировано unself (Сен. 30, 2012 15:05:13)
Офлайн
173
unself
При распаковке готового пакета Питон ругается на выравнивание до 4 байт:
unselfОн не на выравнивание ругается
unpack requires a string argument of length 4
The string must contain exactly the amount of data required by the format (len(string) must equal calcsize(fmt)).
size = struct.unpack(">i", packet[:4])[0] size, message = struct.unpack(">i%ds" % size, packet)
Отредактировано reclosedev (Сен. 30, 2012 17:08:47)
Офлайн