# README
stdlib5.kobj [win & linux] : python - golang C FFI 보조기능들.
func repath() -> str[] # 현재 실행파일의 작업 디렉토리를 자동으로 맞추고 명령줄 인자를 반환. func encode(int num, int length) -> bytes # 정수를 바이트로 리틀 엔디안 인코딩. func decode(bytes data) -> int # 리틀 엔디안 인코딩된 바이트를 정수로 디코딩. func pack(bytes[] series) -> bytes # 여러 바이트열을 하나의 바이트열로 패키징. func unpack(bytes chunk) -> bytes[] # 패키징된 바이트열 덩어리 풀어 바이트열들 반환. func send(bytes data) -> (CCHAR*, int) # 바이트열을 ctypes 포인터로 바꾸고 길이 반환. func recv(CCHAR* reader, int length) -> bytes # 함수 출력 C char 포인터와 길이를 입력받아 바이트열 반환. func recvauto(CCHAR* reader) -> bytes # 함수 출력 C char 포인터를 받아 자동으로 길이 추출해 바이트열 반환. func call(str args, str rets) -> (tuple, CTYPES) # py ctypes 함수 입출력 설정값인 튜플, ctypes 타입 값을 반환. func Repath() -> str[] # 현재 실행파일의 작업 디렉토리를 자동으로 맞추고 명령줄 인자를 반환. func Encode(int num, int length) -> byte[] # 정수를 바이트로 리틀 엔디안 인코딩. func Decode(byte[] data) -> int # 리틀 엔디안 인코딩된 바이트를 정수로 디코딩. func Pack(byte[][] series) -> byte[] # 여러 바이트열을 하나의 바이트열로 패키징. func Unpack(byte[] chunk) -> byte[][] # 패키징된 바이트열 덩어리 풀어 바이트열들 반환. func Recv(CCHAR* arr, CINT length) -> byte[] # C CHAR 포인터와 길이를 받아 바이트 슬라이스 반환. func Send(byte[] arr) -> CCHAR* # 바이트 슬라이스를 데이터 그대로 C CHAR 포인터로 변환. func Sendauto(byte[] arr) -> CCHAR* # 자동으로 길이헤더를 붙어 C CHAR 포인터로 변환. func Free(CCHAR* arr) # malloc으로 할당된 C FFI 메모리를 해제. go -> py로 바이트열을 보낸 후 항상 호출해야 함.기본적으로 사용하는 모듈이 적기에 FFI가 아닌 다른 목적으로 사용할 수도 있습니다. go 소스코드에 주석처리된 부분이 GCC-C로 Cgo와 관련된 부분입니다. 주석을 적절히 복사하여 사용하세요.
!! 구조 제한 !! 바이트 배열 패키징 시 255개 이하로만 전송됩니다. 1GiB 이상의 큰 데이터는 전송에 실패할 수도 있습니다.
python에서 go로 제작된 공유 라이브러리를 호출하는것이 전제입니다. 따라서 바이트 배열이 py -> go로 전송될 때 포인터와 배열크기를 모두 전달하고, 포인터에는 데이터 그 자체가 담깁니다. (constB) 반면 go -> py로 갈 때는 데이터 크기가 알려진 경우, 포인터에 데이터 그 자체를 담습니다. (constB) 데이터 크기가 동적인 경우, auto 옵션이 붙은 함수를 사용해야 합니다. 이 함수는 데이터 앞에 크기 8 바이트를 인코딩하여 다양한 크기의 데이터를 지원합니다. (8B + nB) 바이트열 패키징은 1 바이트 개수 + (8 바이트 길이 + n 바이트 데이터) * 반복 구조입니다. 1B len + (8B size + nB data) * n
ctypes.CDLL("./") 또는 ctypes.cdll.LoadLibrary("./") 로 오브젝트를 호출합니다. obj.함수명.argtype / obj.함수명.restype 로 입출력 타입을 정합니다. python에서 float 전송 시에는 ctypes.c_float 함수로 변환해야 합니다. python call 함수에서 i : 정수, f : 실수, b : 바이트 배열의 타입을 지원합니다.