Что является подходящим буфером для структурного модуля Python - PullRequest
9 голосов
/ 14 ноября 2009

В Python я обращаюсь к двоичному файлу, читая его в строку и затем используя struct.unpack(...). Теперь я хочу записать в эту строку, используя struct.pack_into(...), но получаю ошибку "Невозможно использовать строку в качестве модифицируемого буфера" Каким будет подходящий буфер для использования с модулем struct?

Ответы [ 3 ]

7 голосов
/ 14 ноября 2009

Как отмечается в другом ответе, struct_pack, вероятно, все, что вам нужно и нужно использовать. Однако объекты типа array поддерживают протокол буфера и могут быть изменены:

>>> import array, struct
>>> a = array.array('c', ' ' * 1000)
>>> c = 'a'; i = 1
>>> struct.pack_into('ci', a, -0, c, i)
>>> a
array('c', 'a\x00\x00\x00\x01\x00\x00\x00  ...

Исходный буферный протокол был чем-то вроде взлома, в основном для расширений Си. Он устарел и заменен новым буферным API на уровне C и объектами просмотра памяти в Python 3 (и в готовящемся выпуске 2.7).

6 голосов
/ 14 ноября 2009

Если вы не пытаетесь упаковать его в определенный объект, просто используйте struct.pack, чтобы вернуть строку.

В противном случае, ctypes.create_string_buffer - это один из способов получения изменяемого буфера.

0 голосов
/ 14 ноября 2009

Две возможности сразу бросаются в голову:

  • Вы можете использовать модуль Python stringio для создания буфера чтения / записи с семантикой файла.

  • Вы можете использовать модуль Python array , чтобы получить буфер, который вы можете рассматривать как список, но который будет содержать только двоичные байты.

...