Вы можете использовать модуль struct
для создания двоичных строк из произвольных макетов.
Это может генерировать только выровненные по байту структуры, но вам все равно нужно будет выровнять по байту, чтобы все равно отправить на сетевой сокет.
EDIT:
Так что формат, который вы генерируете, действительно имеет невыровненные биты 8-1-1-2-12-16 и т. Д.
Для отправки по сокету вы должны быть выровнены по байту, но я думаю, что протокол обрабатывает это каким-то образом. (может, где-нибудь с битами-заполнителями?)
Мое новое предложение будет состоять в том, чтобы создать битовую строку, затем разделить ее на 8-битные блоки и преобразовать оттуда:
input_binary_string = "110010111111111111101010" ## must be a multiple of 8
out = []
while len(input_binary_string) >= 8:
byte = input_binary_string[:8]
input_binary_string = input_binary_string[8:]
b = int(byte,2)
c = chr(b)
out.append(c)
## Better not have a bits left over
assert len(input_binary_string) == 0
outString = "".join(out)
print [ ord(c) for c in out ]