Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

293
Views
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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!