Найти - Пользователи
Полная версия: TLV и ctypes
Начало » Python для новичков » TLV и ctypes
1
nsj32734
Всем здравствуйте!

Возникла такая задачка,с 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.
sander
nsj32734
может struct
nsj32734
А если без struct,но с ctypes?
Shaman
Структуру Вы определили неправильно.
Разберите код по https://pyglet.googlecode.com/hg/pyglet/image/codecs/bmp.py - там есть всё что нужно. Обратите внимание на работу с массивами данных типов RGB* и функцию to_ctypes.
nsj32734
Shaman
Структуру Вы определили неправильно.Разберите код по https://pyglet.googlecode.com/hg/pyglet/image/codecs/bmp.py - там есть всё что нужно. Обратите внимание на работу с массивами данных типов RGB* и функцию to_ctypes.

Спс,это уже что-то. Кстати,не подскажете,как правильно?
doza_and
В вашей постановке задачи 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)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB