Десериализация данных C - PullRequest
3 голосов
/ 17 мая 2011

Я получаю структуру по сети с сервера C на мой клиент Python.Протокол UDP.У меня нет контроля над сервером и его протоколами / форматами данных.Он состоит из этой структуры (да, порт IPv4 +):

struct ip_s {
    uint8_t i1;
    uint8_t i2;
    uint8_t i3;
    uint8_t i4;
    uint16_t port; // big endian
};

Помимо порта, который преобразуется в big-endian, данные отправляются «как есть», преобразуются в (char*).

Как получить эту структуру в формате, который может обрабатываться Python?


Дополнительная информация:

  • Python 2.7 или 3.x
  • Кроссплатформенный
  • Желательно решение с использованием только встроенных модулей

Ответы [ 2 ]

3 голосов
/ 17 мая 2011

Загляните в struct.unpack

Вероятно, это будет выглядеть примерно так:

# socket setup

(buffer, sockaddress) = mysocket.recvfrom(6)
if len(buffer)== 6:
    i1,i2,i3,i4, port = struct.unpack('!BBBBH', buffer)
0 голосов
/ 17 мая 2011

Я получаю структуру по сети

Стоп. Не делай этого. Этот метод вводит следующие зависимости:

  1. Порядок слов: big-endian или little-endian.
  2. Перетяжка.
  3. Упаковка.

(2) и (3) в свою очередь зависят от:

  1. Компилятор.
  2. Версия компилятора.
  3. окружающие # прагмы.
  4. Опции компилятора, действовавшие при компиляции программы на Си.

Это довольно много зависимостей. Не делай этого. Определите протокол приложения и используйте его. Или используйте что-то вроде XDR, которое решит проблему за вас.

...