Muszę spakować wprowadzoną wartość w strukturę i wypakować go jako 32-bitowy # (niepodpisany int).

Przykładowym wejściem jest "x08 x08 x08 x08"

Jednak to nie działa:

>>> s = struct.pack('I', '\x08\x08\x08\x08')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
struct.error: cannot convert argument to integer

Co ja robię źle? Owijanie go jako int () nie działa:

>>> int('\x08\x08\x08\x08', 16)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 16: '\x08\x08\x08\x08'

Próbuję zbudować strukturę, która ma inne zapakowane wartości przed i po tym. Na przykład chcę

inp = '\x08\x08\x08\x08'
s = struct.pack('HHIH', 50, 100, inp, 100)

Wracać

'2\x00d\x00\x08\x08\x08\x08d\x00'
0
user1436111 8 grudzień 2013, 00:30

2 odpowiedzi

Najlepsza odpowiedź

Co - dokładnie - Czy chcesz jako wyjście? struct.pack() Wróci (jeśli zadziałał) ciąg dokładnie taki, który przeszedł, na początek. struct.unpack('I', '\x08\x08\x08\x08') Zwraca krotkę {x2}}. Pasza, że z powrotem do struct.pack() i odzyskasz ciąg, zacząłeś od:

>>> import struct
>>> struct.unpack('I', '\x08\x08\x08\x08')
(134744072,)
>>> struct.pack('I', _[0])
'\x08\x08\x08\x08'

Wszystko to działa jako udokumentowane i zgodnie z oczekiwaniami. Więc przejrzysty, co chcesz.

Czy mogę po prostu zrobić coś w rodzaju struct.pack ('h', Somevalue) + 'x08 x08 x08 x08' + struktura x08 x08 x08 '+ struktura.

Może. Zależy to od rzeczy, których nie napisałeś, jak czy używasz struct, aby automatycznie wstawić szpilki bajty (do wyrównania). Jeśli wklejesz ze sobą ciąg, a następnie jesteś odpowiedzialny za zdobycie tego w porządku.

Jeśli zdecydujesz, że chcesz wkleić 4-bajtowy ciąg, a następnie za pomocą kodu formatu struct 4s jest łatwiejszym sposobem na to.

2
Tim Peters 7 grudzień 2013, 20:48

Ciąg "x08 x08 x08 x08" jest już "zapakowany" reprezentację liczby całkowitej. Jeśli chcesz przekonwertować go na integer Python, powinieneś spróbować tego:

struct.unpack('I','\x08\x08\x08\x08')

Oczywiście zwróć uwagę na endianność.

0
smeso 7 grudzień 2013, 20:41