Python Ctypes를 사용하여 공유 라이브러리에서 Python 문자열로 플로트를 버퍼링합니다.
-
22-08-2019 - |
문제
공유 라이브러리 에서이 두 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가없는 해결 방법으로 그렇게하고 있는지 확실하지 않았습니다.