Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 3, 2015 09:03:30

nsj32734
Зарегистрирован: 2015-06-03
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

TLV и ctypes

Всем здравствуйте!

Возникла такая задачка,с ctypes вообще не работал:

1) Как описать TLV на ctypes?
Сам TLV имеет следующий формат:

Идентификатор (2 байта)+Длина данных (2 байта)+Данные (Переменная длина)

Описал так:

class Tlv(Structure):
    _fields = [("tag",c_ushort), ("len",c_ushort), ("data",POINTER(c_ubytes)) ]

Но есть сомнения насчет поля data (байтовый массив). Или это правильно?

2) Как массив байт распарсить в TLV? По сети прибегает массив байт,который составлен из TLV. Как считать оттуда TLV на ctypes,что использовать (указатели итд.)? (нужен пример,т.к. с ctypes плохо знаком). Формат данных в сетевом пакете такой: заголовок (12 байт,есть поле указывающее на длину данных),за ним лежит байтовый массив из TLV.

Отредактировано nsj32734 (Июнь 3, 2015 09:05:01)

Офлайн

#2 Июнь 3, 2015 09:44:14

sander
Зарегистрирован: 2015-02-19
Сообщения: 317
Репутация: +  53  -
Профиль   Отправить e-mail  

TLV и ctypes

nsj32734
может struct

Офлайн

#3 Июнь 3, 2015 11:34:54

nsj32734
Зарегистрирован: 2015-06-03
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

TLV и ctypes

А если без struct,но с ctypes?

Офлайн

#4 Июнь 3, 2015 12:46:53

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

TLV и ctypes

Структуру Вы определили неправильно.
Разберите код по https://pyglet.googlecode.com/hg/pyglet/image/codecs/bmp.py - там есть всё что нужно. Обратите внимание на работу с массивами данных типов RGB* и функцию to_ctypes.

Офлайн

#5 Июнь 3, 2015 14:27:33

nsj32734
Зарегистрирован: 2015-06-03
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

TLV и ctypes

Shaman
Структуру Вы определили неправильно.Разберите код по https://pyglet.googlecode.com/hg/pyglet/image/codecs/bmp.py - там есть всё что нужно. Обратите внимание на работу с массивами данных типов RGB* и функцию to_ctypes.

Спс,это уже что-то. Кстати,не подскажете,как правильно?

Отредактировано nsj32734 (Июнь 3, 2015 14:30:39)

Офлайн

#6 Июнь 3, 2015 21:22:31

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

TLV и ctypes

В вашей постановке задачи ctypes вообще не нужен. Такие данные обычно ползут из потока сокета файла и т.п. Поэтому и нужна длина элемента. Служебная информация при этом обычно отбрасывается.

Тема избитая но позволю себе предложить велосипед:

class Header(Structure):
    _fields_ = [ ('ident',c_short), ('L',c_short)]
def loader(stream):
    h=Header()
    while 1:
         h.readinto(stream)
         data=stream.read(h.L)
         yield (h.ident,data)



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version