Пакет Python фиксированной длины - PullRequest
2 голосов
/ 05 октября 2009

Я пытаюсь собрать пакет фиксированной длины в python для генератора PSIP ATSC. Это, наверное, очень просто, но пока я не могу заставить его работать. Я пытаюсь создать пакет с полями, похожими на следующие:

table_id = 0xCB
syntax = 0b1
reserved = 0b11
table_ext = 0xFF

конечной целью в двоичном виде будет следующая

'1100101111111111111'

Я пробовал дюжину разных вещей и не могу получить ожидаемых результатов. Я собираюсь отправить это через сокеты, так что я считаю, что это должно заканчиваться строкой.

Ответы [ 2 ]

4 голосов
/ 05 октября 2009

Вы можете использовать модуль 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 ]
0 голосов
/ 28 апреля 2014

Construct (http://construct.readthedocs.org/en/latest/) - это синтаксический анализатор и компоновщик для двоичных данных. Он выглядит идеальным для этого приложения, так как вы можете определять вещи из битов и байтов. Он также имеет полезные функции, такие как обработка условного ситуации, а также легко проверять терминаторы и тому подобное.

Я потратил годы, используя систему для сложного создания и анализа пакетов, у которой не было некоторых функций, которые есть у Construct, поэтому, если в протоколе нет чего-то особенно странного, похоже, что Construct справится с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...