Вопрос

Я создал объект buffer в python следующим образом:

f = io.open('some_file', 'rb')
byte_stream = buffer(f.read(4096))

Сейчас я прохожу мимо. byte_stream в качестве параметра функции на языке Си, через SWIG.У меня есть типовая карта для преобразования данных, которая выглядит следующим образом:

%typemap(in) unsigned char * byte_stream {
    PyObject *buf = $input;
    //some code to read the contents of buf
}

Я попробовал несколько разных вещей, из-за которых ошибка не может добраться до фактического содержимого / значения моего byte_stream.Как мне преобразовать содержимое моего сайта или получить к нему доступ byte_stream используете C API?Существует много различных методов преобразования данных C в буфер, но ни один из них, который я могу найти, не позволяет поступить наоборот.Я пытался просмотреть этот объект в gcb, но ни он, ни значения, на которые он указывает, не содержат моих данных.

(Я использую буферы, потому что хочу избежать накладных расходов на преобразование данных в строку при чтении их из файла) Я использую python 2.6 в Linux.

-- Спасибо, Павел

Это было полезно?

Решение

Я использую буферы, потому что хочу избежать накладных расходов на преобразование данных в строку при чтении их из файла

Вы ничего не избегаете.Строка уже построена пользователем read() способ.Зовущий buffer() просто создает дополнительный объект buffer, указывающий на эту строку.

Что касается доступа к памяти, на которую указывает объект buffer, попробуйте PyObject_AsReadBuffer().Смотрите также http://docs.python.org/c-api/objbuffer.html.

Другие советы

Как только вы воспользуетесь read метод на вашем файловом объекте, данные будут преобразованы в str объект;вызывая buffer метод не преобразует его в поток какого-либо вида.Если вы хотите избежать накладных расходов на создание объекта string, вы могли бы просто передать объект file в свой C-код, а затем использовать его через его C API.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top