LINUX.ORG.RU

Python и бинарные данные


0

0

В данный момент присматриваюсь к питону. Меня интересует, может ли он работать с бинарными данными? Например, мне нужно прочитать и разобрать заголовок ELF файла. Или для работы в сети мне нужно читать передавать данные в виде определенной структуры. Можно ли реализовать это без костылей на питоне?


А чем бинарные данные отличаются от текстовых? Шириной диапазона только.

Zmacs
()

> В данный момент присматриваюсь к питону.Меня интересует, может ли он
> работать с бинарными данными? Например, мне нужно прочитать и
> разобрать заголовок ELF файла. Или для работы в сети мне нужно читать
> передавать данные в виде определенной структуры. Можно ли реализовать
> это без костылей на питоне?

Можно. Данные передаются и возвращаются в виде неуникодных строк, но
никаких ограничений на используемые в них символы нет. Еще есть
специальный модуль struct, который позволяет упаковывать питоновские
значения в бинарные строки согласно данному описанию:

http://python.org/doc/2.4.1/lib/module-struct.html

int19h ★★★★
()

struct { int x, y; char s[10]; } s1; Допустим, что есть файл, в него записана эта структура. Как это прочесть на Python? Не могли бы тут привести не большой пример с этими функциями. pack() unpack()

I3rain
() автор топика
Ответ на: комментарий от I3rain

> struct { int x, y;
> char s[10];
> } s1;
>
> Допустим, что есть файл, в него записана эта структура. Как это
> прочесть на Python? Не могли бы тут привести не большой пример с
> этими функциями.

Гм... в общем случае, читать/писать сишные структуры напрямую - это
дохлое дело, в связи с неопределенностью размерности типов,
существованием padding и прочего. Ну ладно, предположим, что структура
упакованная, а int 32-битный, тогда:

s1 = "ii10s" # struct description
s = file.read(struct.calcsize(s1))
x, y, s = struct.unpack(s1, s)

int19h ★★★★
()
Ответ на: комментарий от int19h

Спасибо int19h, это то что я хотел увидеть

I3rain
() автор топика
Ответ на: комментарий от int19h

Упакованная структура

>> struct { int x, y;
>> char s[10];
>> } s1;

>s1 = "ii10s" # struct description
>s = file.read(struct.calcsize(s1))
>x, y, s = struct.unpack(s1, s)

В данном случае выравнивание неважно, а если структура такая:

struct {
 unsigned char a;
 int x, y;
 char s[10];
} s1;

то 'Bii10s' или '@Bii10s' для неупакованной, и
'=Bii10s' для упакованной структуры.

>>> import struct
>>> struct.calcsize('Bii10s')
22
>>> struct.calcsize('@Bii10s')
22
>>> struct.calcsize('=Bii10s')
19

DKorolkov
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.