2013-04-12 1 views
1

우선 나는 ctypes를 처음 사용하고 제 질문에 대한 대답을 검색했습니다. 확실히 여기에서 어떤 통찰력을 주셔서 감사합니다.char * 객체를 생성하여 C++/c 공유 객체 라이브러리에 전송

다른 도구에서 제공 한 바이트 문자열이 있습니다. 여기에는 16 진수 및 기타 값이 표시됩니다. 다음과 같이

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) 

문제는 내가 C로 ++ 라이브러리를 mycharp 또는 mybuff 중 하나를 전송하는 .so 기능입니다, 다음과 같이 나는 c_char_p 개체를 만드는거야 문자열은 NULL 종결

나는 C++ 라이브러리를로드하고있어 ('\의 x00에서'의 첫 번째 항목)에 차단하고 함수를 호출하면 다음과 같이됩니다 :

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

C++ 함수는 char *

NULL 터미네이터 ('\ x00')가 포함 된 전체 문자열을 보낼 수있는 방법을 알고 있습니까?

감사

+0

버퍼가 끝나는 위치를 C++ 코드가 어떻게 알 수 있습니까? –

+0

감사합니다. 그는 데이터를 올바르게 처리하기 위해 자신의 편을 변화시켜야했습니다. –

답변

2

는 *는 vector<char> vec에 원본 데이터를 추가하고 vec.data()

를 보내 그러나 실제 문제는

은 C++ 함수는 문자를 기대하고있다.

당신은 당신이 널 (null)을 포함하여 문자의 배열을 수락 할 경우 (버퍼의 두 번째 인수 = 길이를 수용하기 위해, 또는 예를 들어, vector<char>을 받아)이을 변경해야합니다.

또는 C++ 함수에서 실제로 원하는 것이 무엇인지 파악하고 char 배열의 "전처리"를 수행하고 각 새 배열에 null 종결자를 추가 한 다음 C++ 함수로 전송합니다 .

예를 들어, "입력"배열이 실제로 c 문자열 세트라고 판단 할 수 있습니다. 간단한 구문 분석을 수행하여 "분할"을 수행하고 사이클 1에서 C++로 전송해야합니다.

또는 입력을 UTF16이 아닌 UTF8의 문자열로 결정할 수도 있습니다. 그런 다음 가능하면 UTF8로 변환하고 C++ 함수로 보내야합니다.

+0

팁 주셔서 감사. 다른 개발자의 C++ 라이브러리가 데이터를 올바르게 처리하지 못했습니다. –

관련 문제