Необходимо сформировать пакет вручную и отправить его на сервер.
reclosedevспасибо
v='0.2456' f1=0 f2=1 adr='123' w0=pack(">5sbb9s",v,f1,f2,adr)
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спасибо
if len(a)%2==1:
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) ...
reclosedevСлова считаются как целые 16-разрядные
. При распаковке готового пакета Питон ругается на выравнивание до 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
При распаковке готового пакета Питон ругается на выравнивание до 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)