указатели — проблема при создании объекта char * для отправки в библиотеку общих объектов c ++ / c

Прежде всего, я новичок в ctypes и действительно искал ответ на мой вопрос. Определенно оценю любое понимание отсюда.

У меня есть строка байтов, предоставленная мне другим инструментом. Он содержит то, что кажется шестнадцатеричным и другими значениями. Я создаю объект c_char_p следующим образом:

mybytestring = b'something with a lot of hex \x00\x00\xc7\x87\x9bb and other alphanumeric and non-word characters'     # Length of this is very long let's say 480
mycharp = c_char_p(mybytestring)

Я также создаю c_char_Array следующим образом:

mybuff = create_string_buffer(mybytestring)

Проблема в том, что когда я отправляю mycharp или mybuff в функцию .so библиотеки c ++, строка обрезается в завершающем NULL (первое вхождение ‘\ x00’)

Я загружаю библиотеку c ++ и вызываю функцию следующим образом:

lib_handle = cdll.LoadLibrary(mylib.so)
lib_handle.myfunction(mycharp)
lib_handle.myfunction(mybuff)

Функция c ++ ожидает символ *

Кто-нибудь знает, как быть в состоянии отправить всю строку с включенными NULL-терминаторами (‘\ x00’)?

Спасибо

1

Решение

Добавьте ваши исходные данные в vector<char> vec, и отправить vec.data()

Но актуальная проблема

Функция c ++ ожидает символ *.

Вам нужно будет изменить это (принять второй аргумент arg = длина буфера или, например, принять vector<char>) если вы хотите, чтобы он принимал массив char, включая null.

В качестве альтернативы вы можете выяснить, что вы на самом деле хотите, чтобы выполняла функция c ++, и сделать self «предварительной обработкой» массива char, добавив нулевой терминатор в каждый новый массив, и после этого отправьте в функцию c ++.

Например, вы можете решить, что массив «input» на самом деле представляет собой набор c-строки: вам нужно будет выполнить простой анализ для «split» и отправить его на c ++ в цикле один за другим.

Или, может быть, вы решили, что вводом может быть строка в UTF16, а не UTF8. Затем вам нужно, насколько это возможно, преобразовать его в UTF8 и отправить в функцию c ++.

2

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

Других решений пока нет …