Warto zainteresować się modułem struct
. Przy pomocy funkcji pack
i unpack
możesz łatwo skonwertować inty, znaki, napisy na postać binarną i z powrotem. Poniżej prosty przykład jak listę intów 0..255 można zamienić na bufor bajtów, a potem go ponownie przekonwertować na tupla. Bufor ma ciekawą funkcje hex
, która zamienia bajty na napis heksadecymalny z opcją wstawiana dowolnego znaku przestankowego między bajtami.
Taki bufor bajtów możesz możesz przekonwertować na różne typy, więcej znajdziesz w dokumentacji help(struc)
. W przykładzie jest sposób jak zinterpretować bajty jako liczby 16bitowe zarówno dla little i big endian:
#!/usr/bin/env python3
from struct import pack,unpack
lista_int_8bit=[70,92,0,25,76,83,1,225]
print(lista_int_8bit, len(lista_int_8bit))
pack_string = f"8B" # 8 unsigned chars
print(f"{pack_string=}")
bufor = pack(pack_string, *lista_int_8bit)
print(f"{bufor=}")
print(f"{bufor.hex(' ')=}")
print(f"{unpack(pack_string, bufor)=}")
unpack_string16_LE = f"<4H" # < little endian
unpack_string16_BE = f">4H" # > big endian
print(f"{unpack_string16_LE=}")
print(f"{unpack_string16_BE=}")
print(f"{unpack(unpack_string16_LE, bufor)=}")
print(f"{unpack(unpack_string16_BE, bufor)=}")
wynik działania
[70, 92, 0, 25, 76, 83, 1, 225] 8
pack_string='8B'
bufor=b'F\\\x00\x19LS\x01\xe1'
bufor.hex(' ')='46 5c 00 19 4c 53 01 e1'
unpack(pack_string, bufor)=(70, 92, 0, 25, 76, 83, 1, 225)
unpack_string16_LE='<4H'
unpack_string16_BE='>4H'
unpack(unpack_string16_LE, bufor)=(23622, 6400, 21324, 57601)
unpack(unpack_string16_BE, bufor)=(18012, 25, 19539, 481)
Zamiast funkcji hex
lub bin
do konwertowania lepiej nadaje się f-string, poniżej prosty przykład:
In [34]: lista_int_8bit=[70,92,0,25,76,83,1,225]
In [35]: '_'.join([f"{znak:02X}" for znak in lista_int_8bit])
Out[35]: '46_5C_00_19_4C_53_01_E1'
In [39]: ' '.join([f"{znak:08b}" for znak in lista_int_8bit])
Out[39]: '01000110 01011100 00000000 00011001 01001100 01010011 00000001 11100001'