2017-02-04 4 views
0

Python struct.pack_into с форматом char 'x' требует больше байтов.

Я пытаюсь узнать о байт-массивах python, чтобы иметь возможность писать собственные заголовки IP, TPC, UDP. Я использую struct в python для упаковки и распаковывания двоичных данных, поэтому указанные типы задают строку формата.struct.pack_into требует большего количества байтов, указанного в формате

ba2 = bytearray(2) 
print(ba2, "The size: ", ba2.__len__()) 
struct.pack_into(">bx", ba2, 1, 1) 

print(struct.unpack(">bx", ba2)) 

Теперь, когда я пытаюсь собрать в буфер длиной 2 с ">bx" в формате, в соответствии с выше коде, я получаю ошибку:

bytearray(b'\x00\x00') The size: 2 
Traceback (most recent call last): 
    File "D:/User/Documents/Python/Network/Main.py", line 58, in <module> 
    bitoperations_bytes_bytearrays_test() 
    File "D:/User/Documents/Python/Network/Main.py", line 49, in bitoperations_bytes_bytearrays_test 
    struct.pack_into(">bx", ba2, 1, 1) 
struct.error: pack_into requires a buffer of at least 2 bytes 

, но у меня есть массив байтов 2 байта ,

Что я делаю неправильно?

И, пожалуйста, обратитесь к какой-либо документации, если я пропустил ее (я прочитал документ python, но, возможно, пропустил его).

Edit:

Извините, если я был неясен. но я хочу просто изменить второй байт в массиве байтов. Таким образом, 'x' padd в формате.

И так же глупо, как я был это просто исключить «х» в формате, как thiss:

struct.pack_into(">b", ba2, 1, 1) 

и право упаковки будет иметь бен сделал. С этим выходом:

bytearray(b'\x00\x00') The size: 2 
A pack with one byte shift: 0001 
(0, 1) 

ответ

0

И так глуп, как я был это просто исключить «х» в формате, как thiss:

struct.pack_into(">b", ba2, 1, 1) 

и право упаковки будет иметь бен сделал. С этим выходом:

bytearray(b'\x00\x00') The size: 2 
A pack with one byte shift: 0001 
(0, 1) 
1

Вам нужен еще один параметр для вызова функции pack_into(). Третий параметр является обязательным и он смещается в целевом буфере (см. https://docs.python.org/2/library/struct.html). Ваш формат также неверен, потому что он просто ожидает один байт. После кода фиксирует ваши проблемы:

import struct 

ba2 = bytearray(2) 
print(ba2, "The size: ", ba2.__len__()) 
struct.pack_into("bb", ba2, 0, 1, 1) 

print(struct.unpack("bb", ba2)) 
+0

Благодарим за ответ. Но я хочу иметь возможность добавлять только байт (00000001) влево от первого байта, не меняя его, таким образом байт pad x. Потому что, если я просто хочу добавить поле в заголовок, мне нужно сделать смещение (в данном случае 1) с самого начала и не заполнить первое пространство чем-то. –

Смежные вопросы