Реализация бинарного протокола в Python (витая) - PullRequest
3 голосов
/ 07 августа 2011

Я написал TCP-сервер в node.js, реализующий двоичный протокол. Используя буферы, это было очень легко в node.js. http://nodejs.org/docs/v0.5.3/api/buffers.html

Я ищу аналогичный способ реализации моего протокола в Python 2.7 с использованием витой. Однако, если есть лучший инструмент для работы, сочетающий Python 3 и какой-то четный ввод / вывод, пожалуйста, дайте мне знать. Из-за объекта байтов в Python 3, на первый взгляд кажется, что Python 3 лучше обрабатывает двоичные протоколы. Мне нужно обработать много TCP (и UDP) соединений и написать немного GUI.

Вот как реализовать мой протокол в node.js:

var buf = new Buffer(5+data.length),  //headers + data (data is also a buffer)
    action = 0x01;

buf[0] = action;
buf.writeUInt16(data.length,1,'big'); //write content length in at offset 1
buf.writeUint16(12345,5,'big');       //message identifier at offset 3
data.copy(buf,5);                     //copy data into message at offset 5

socket.write(buf);

Буду признателен за примеры того, как выполнить аналогичные инструкции в python.

Редактировать: так я смог реализовать свой протокол с помощью модуля структуры python:

self.transport.write(struct.pack('!bHH',action,data.length, sock_id) + data)

Ответы [ 3 ]

3 голосов
/ 07 августа 2011

Похоже, стандартный модуль Python struct будет делать то, что вам нужно. Это позволяет вам точно указать, какой должна быть структура двоичных данных.

Возможности обработки двоичных протоколов в Python 2 и Python 3 эквивалентны.

0 голосов
/ 09 августа 2016

Если вы хотите немного больше абстрагироваться от модуля struct, попробуйте protlib.Приятно то, что вы можете иметь дело с объектами Python из коробки вместо отдельных полей.

0 голосов
/ 29 августа 2011

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

...