Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

295
Visualizações
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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda