Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

296
Vistas
Pasar enteros grandes de Python (> 256 bits) hacia y desde C ++ con pybind11

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 ?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

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'

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda