Из буфера C ++ в python :: boost :: list

Я пытаюсь преобразовать буфер C ++ в python :: boost :: list, мой класс C ++:

#include "boost/python/list.hpp"
using namespace boost::python;

class Buffer {
public:
unsigned char* m_pBuff;
int m_iWidth;
int m_iHeight;Buffer( cont int p_iWidth, const int p_iHeight ) {
m_pBuff = new unsigned char[p_iWidth * p_iHeight];

m_iWidth  = p_iWidth;
m_iHeight = p_iHeight;
}

~Buffer() { delete[] m_pBuff; }

/* Class Functions */

list getList ( void ) {
list l;
l.append(m_iWidth);
l.append(m_iHeight);

std::string data(m_iWidth * m_iHeight, ' ');

unsigned char* pBuff = m_pBuff;
for ( int i = 0; i < m_iWidth * m_iHeight; ++i, ++pBuff ) {
data[i] = (char*) *pBuff;
}

l.append(data);

return l;
}
};

И модуль повышения Python определяется как:

using namespace boost::python;

BOOST_PYTHON_MODULE(BufferMethods)
{

class_<Buffer>("Buffer", init<const int, const int>())
.add_property("width", &Buffer::m_iWidth)
.add_property("height", &Buffer::m_iHeight)
/* Other functions */
.def("getList", &Buffer::getList)
;
}

Но когда я запускаю модуль в python, он возвращает эту ошибку:

>>> from BufferMethods import *
>>> Buff = Buffer(800, 600)
>>> dataList = Buff.getList()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe0 in position 0: invalid continuation byte
>>>

Что я делаю не так ?? Я использую Python 3.3.

1

Решение

Когда вы пытаетесь добавить элементы в boost::python::list Например, тип python добавленного элемента определяется из типа объекта C ++, заданного в качестве аргумента. Так как ваш data имеет тип std::string, эта операция добавления пытается создать строку Python. Предположение: я предполагаю, что строки Python должны придерживаться некоторого макета, и, поскольку вы просто предоставляете ему некоторые случайные данные, он не может интерпретировать их как допустимую строку, поэтому вы получаете UnicodeDecodeError. Я не знаю, что именно вы намереваетесь делать со списком, и как бы вы хотели представить свой буфер в Python, но, похоже, работает следующее (используя std::vector<char> как тип data вместо std::string):

#include <boost/python.hpp>
#include <boost/python/list.hpp>
#include <boost/python/suite/indexing/vector_indexing_suite.hpp>
#include <vector>

using namespace boost::python;

class Buffer {
public:
unsigned char* m_pBuff;
int m_iWidth;
int m_iHeight;Buffer( const int p_iWidth, const int p_iHeight ) {
m_pBuff = new unsigned char[p_iWidth * p_iHeight];

m_iWidth  = p_iWidth;
m_iHeight = p_iHeight;
}

~Buffer() { delete[] m_pBuff; }

/* Class Functions */

list getList ( void ) {
list l;
l.append(m_iWidth);
l.append(m_iHeight);

std::vector<char> data(m_iWidth*m_iHeight);

unsigned char* pBuff = m_pBuff;
for ( int i = 0; i < m_iWidth * m_iHeight; ++i, ++pBuff ) {
data[i] = (char) *pBuff;
}

l.append(data);

return l;
}
};

BOOST_PYTHON_MODULE(BufferMethods)
{

class_<std::vector<char> >("CharVec")
.def(vector_indexing_suite<std::vector<char> >());class_<Buffer>("Buffer", init<const int, const int>())
.add_property("width", &Buffer::m_iWidth)
.add_property("height", &Buffer::m_iHeight)
/* Other functions */
.def("getList", &Buffer::getList)
;
}

Итак, в python (3.2):

In [1]: from BufferMethods import *

In [2]: Buff = Buffer(800,600)

In [3]: dataList = Buff.getList()

In [4]: dataList[2]
Out[4]: <BufferMethods.CharVec at 0x18172d0>

In [5]: dataList[2][2]
Out[5]: '\x00'
1

Другие решения

Проблема решена с помощью Python 2.7 … возможно, ошибка вызвана тем, что я использую неофициальную сборку python.boost из Вот.

0

По вопросам рекламы [email protected]