Python Ctypes를 사용하여 공유 라이브러리에서 Python 문자열로 플로트를 버퍼링합니다.

StackOverflow https://stackoverflow.com/questions/704777

문제

공유 라이브러리 에서이 두 C 함수를 사용하기 위해 Python CTypes를 사용하려고합니다.

bool decompress_rgb(unsigned char *data, long dataLen, int scale)
float* getRgbBuffer()

첫 번째 기능은 잘 작동합니다. 공유 라이브러리에 디버그 코드를 넣고 입력을 확인하여 알 수 있습니다.

문제는 데이터를 제거하는 것입니다. RGB 버퍼는 플로트에 대한 포인터이며 (분명히)이 포인터는 응용 프로그램 수명 동안 일정하게 유지됩니다. 그러므로 이미지를 압축하고 싶을 때마다 decompress_rgb 그런 다음 위치에 무엇이 있는지 확인해야합니다. getRgbBuffer. 버퍼 크기가 (720 * 288 * sizeof (float))이라는 것을 알고 있으므로 어딘가에 연주해야한다고 생각합니다.

아니요 c_float_p 유형을 시도하여 이것을 시도 할 것이라고 생각했습니다.

getRgbBuffer.restype = c_char_p

그럼 나는한다 :

ptr = getRgbBuffer()
print "ptr is ", ptr

출력 만 :

ptr = 3078746120

나는 그것이 콘텐츠가 아닌 실제 주소라고 생각하지만, 포인터를 성공적으로 피하고 내용을 얻었더라도 첫 번째 숯일뿐입니다.

전체 버퍼의 내용을 Python 문자열로 어떻게 얻을 수 있습니까?

편집하다: 변경해야했습니다 :

getRgbBuffer.restype = c_char_p

에게

getRgbBuffer.restype = c_void_p

그러나 Bastardsaint의 답변은 효과가있었습니다.

도움이 되었습니까?

해결책

완전히 테스트되지는 않았지만이 라인을 따라 무언가라고 생각합니다.

buffer_size = 720 * 288 * ctypes.sizeof(ctypes.c_float)
rgb_buffer = ctypes.create_string_buffer(buffer_size) 
ctypes.memmove(rgb_buffer, getRgbBuffer(), buffer_size)

키는 다음과 같습니다 ctypes.memmove() 기능. 로부터 CTYPES 문서:

memmove(dst, src, count)
표준 C Memmove 라이브러리 기능과 동일합니다 : 사본 count 바이트 src 에게 dst. dst 그리고 src 포인터로 변환 할 수있는 정수 또는 CTypes 인스턴스 여야합니다.

위의 스 니펫이 실행되면 rgb_buffer.value 첫 번째까지 콘텐츠를 반환합니다 '\0'. 모든 바이트를 파이썬 문자열로 얻으려면 모든 것을 슬라이스 할 수 있습니다. buffer_contents = rgb_buffer[:].

다른 팁

CTYPES를 사용한 지 얼마되지 않았고 이것을 테스트하기에 충분히 "double *"을 반환하는 것이 없지만 C_FLOAT_P를 원한다면 :

c_float_p = ctypes.POINTER(ctypes.c_float)

BastardsAnt의 답변을 읽으면 원시 데이터 만 원하지만 C_FLOAT_P가없는 해결 방법으로 그렇게하고 있는지 확실하지 않았습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top