Estoy desarrollando un contenedor de python para un esquema de criptografía basado en C++ donde las claves y el texto cifrado son números muy grandes (hasta 2048 bits).
En C++, estoy usando la clase Intel BigNumber para almacenar y manejar números tan grandes.
Como Python admite de forma nativa "aparentemente" infinitos bits de enteros a través de objetos, tengo problemas para pasar variables como parámetros a través de Python.
py::class_<BigNumber>(m, "BigNumber") .def(py::init<unsigned int>()) .def(py::init<int>()) .def(py::init<BigNumber>()) .def(py::init([](py::list data) { size_t length = data.size(); unsigned int* pData = new unsigned int[length]; for (int i = 0; i < length; i++) { pData[i] = data[i].cast<unsigned int>(); } return std::unique_ptr<BigNumber>(new BigNumber(pData, length)); })) .def(py::init([](py::array_t<unsigned int> data) { py::buffer_info buffer_info = data.request(); unsigned int* pData = static_cast<unsigned int*>(buffer_info.ptr); std::vector<ssize_t> shape = buffer_info.shape; return std::unique_ptr<BigNumber>(new BigNumber(pData, shape[0])); }))La parte anterior permite una sola variable de hasta 32 bits o una lista/matriz de enteros grandes desglosados (cada uno de 32 bits)
¿Qué pasa si quiero tomar enteros muy grandes de Python como entrada para llenar la clase BigNumber , y también qué debo hacer para definir una función def_property_readonly() que regresa como un objeto entero grande comprensible de Python?
Edit1: Pasar un entero grande de Python a C++ Con la ayuda del BigNumber(const char* s) , se puede hacer de la siguiente manera:
.def(py::init([](py::object obj){ std::string s_obj = py::str(obj); return std::unique_ptr<BigNumber>(new BigNumber(&s_obj[0])); })) Averiguar cómo hacer inversa, probablemente std::string a py::object con py::cast ?
Respuesta para el primer caso: pasar un objeto entero muy grande (> 256 bits) de Python a C ++ con BigNumber
Pasar un entero grande de Python a C++ Con la ayuda del BigNumber(const char* s) , se puede hacer de la siguiente manera:
.def(py::init([](py::object obj){ std::string s_obj = py::str(obj); return std::make_unique<BigNumber>(s_obj.c_str()); }))Sin embargo, volver a Python con un objeto entero grande sigue siendo WIP
Intenté volver a python con py::int_ como:
.def("val", [](BigNumber const& self){ std::string s_hex; self.num2hex(s_hex); return py::int_(s_hex); })Sin embargo, esto invoca el mismo error de valor cuando intenta
>>> int("0x12345")en Python.
ValueError: invalid literal for int() with base 10: '0x12345'