2013-04-26 26 views
9

Tôi đã có thư viện C++ của bên thứ ba trong đó một số phương thức lớp sử dụng bộ đệm byte thô. Tôi không hoàn toàn chắc chắn làm thế nào để đối phó trong Boost :: Python với nó.Làm cách nào để hiển thị bộ đệm byte thô bằng Boost :: Python?

Thư viện C++ tiêu đề là cái gì đó như:

class CSomeClass 
{ 
    public: 
     int load(unsigned char *& pInBufferData, int & iInBufferSize); 
     int save(unsigned char *& pOutBufferData, int & iOutBufferSize); 
} 

Trong mắc kẹt với Boost :: mã Python ...

class_<CSomeClass>("CSomeClass", init<>()) 
    .def("load", &CSomeClass::load, (args(/* what do I put here??? */))) 
    .def("save", &CSomeClass::save, (args(/* what do I put here??? */))) 

Làm thế nào để bọc các bộ đệm thô để lộ chúng như liệu chuỗi trong Python?

Trả lời

8

Bạn phải tự viết các hàm trên đối tượng Py_buffer từ dữ liệu đó, cho phép bạn chỉ đọc (sử dụng PyBuffer_FromMemory) hoặc đọc-ghi (sử dụng PyBuffer_FromReadWriteMemory) C được phân bổ trước của bạn Bộ nhớ C++ từ Python.

Đây là cách nó sẽ trông giống như (phản hồi hoan nghênh nhất):

#include <boost/python.hpp> 

using namespace boost::python; 

//I'm assuming your buffer data is allocated from CSomeClass::load() 
//it should return the allocated size in the second argument 
static object csomeclass_load(CSomeClass& self) { 
    unsigned char* buffer; 
    int size; 
    self.load(buffer, size); 

    //now you wrap that as buffer 
    PyObject* py_buf = PyBuffer_FromReadWriteMemory(buffer, size); 
    object retval = object(handle<>(py_buf)); 
    return retval; 
} 

static int csomeclass_save(CSomeClass& self, object buffer) { 
    PyObject* py_buffer = buffer.ptr(); 
    if (!PyBuffer_Check(py_buffer)) { 
    //raise TypeError using standard boost::python mechanisms 
    } 

    //you can also write checks here for length, verify the 
    //buffer is memory-contiguous, etc. 
    unsigned char* cxx_buf = (unsigned char*)py_buffer.buf; 
    int size = (int)py_buffer.len; 
    return self.save(cxx_buf, size); 
} 

Sau đó, khi bạn gắn CSomeClass, sử dụng các chức năng tĩnh ở trên thay vì các phương pháp loadsave:

//I think that you should use boost::python::arg instead of boost::python::args 
// -- it gives you better control on the documentation 
class_<CSomeClass>("CSomeClass", init<>()) 
    .def("load", &csomeclass_load, (arg("self")), "doc for load - returns a buffer") 
    .def("save", &csomeclass_save, (arg("self"), arg("buffer")), "doc for save - requires a buffer") 
    ; 

Điều này sẽ trông đủ sâu đối với tôi.

+1

'py_buffer' thuộc loại' PyObject * 'và bạn đang gọi' .buf' trên đó? –

+0

Tôi nghĩ rằng bạn nói đúng, nên có một diễn viên nào đó trước đó để 'PyBufferObject'. Mã này hiện đã lỗi thời. Bộ đệm kiểu mới đang ở đó và có thể nên xem xét sử dụng chúng. –

+0

Tôi biết đây là câu hỏi cũ, nhưng bạn có thể đăng liên kết đến một số thông tin về "bộ đệm kiểu mới" không? Tôi không thể tìm thấy bất cứ điều gì:/ – jpihl

Các vấn đề liên quan