Прежде всего, я новичок в 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’)?
Спасибо
Добавьте ваши исходные данные в vector<char> vec
, и отправить vec.data()
Но актуальная проблема
Функция c ++ ожидает символ *.
Вам нужно будет изменить это (принять второй аргумент arg = длина буфера или, например, принять vector<char>
) если вы хотите, чтобы он принимал массив char, включая null.
В качестве альтернативы вы можете выяснить, что вы на самом деле хотите, чтобы выполняла функция c ++, и сделать self «предварительной обработкой» массива char, добавив нулевой терминатор в каждый новый массив, и после этого отправьте в функцию c ++.
Например, вы можете решить, что массив «input» на самом деле представляет собой набор c-строки: вам нужно будет выполнить простой анализ для «split» и отправить его на c ++ в цикле один за другим.
Или, может быть, вы решили, что вводом может быть строка в UTF16, а не UTF8. Затем вам нужно, насколько это возможно, преобразовать его в UTF8 и отправить в функцию c ++.
Других решений пока нет …