질문 'ctypes.ArgumentError: argument 2: <type 'exceptions.TypeError'>: 라즈베리파이에서 오류

조회수 477회

C++ library(.so)를 만들어 파이썬에서 사용하고 싶습니다. 그러나 보시다시피 C++ 함수 ShiftRows의 함수 인수는 고정된 크기의 배열입니다.

아래 소스와 같이 파이썬 소스를 생성할 때, lib.ShiftRows.argypes=[type.c_void_p, ?] "?" 섹션에 어떤 유형의 데이터를 넣어야 합니까?

그리고 실제로 아래의 AESClass.pyAESS 클래스를 사용할 때 C++와 동일한 어레이 변수를 선언하기 위해서 파이썬에선 어떤식으로 배열을 선언합니까?

AES.cpp

void AESS::ShiftRows( char state[0x04][0x04]) {
  int i, j, k, tmp;

  for (i = 0; i<4; i++) {
    for (j = 4 - i; j<4; j++) {
      tmp = state[i][0];
      for (k = 0; k<4 - 1; k++) {
        state[i][k] = state[i][k + 1];
      }
      state[i][3] = tmp;
    }
  }
}

extern "C"
{
  AESS* AESS_new(){ return new AESS(); }
  void ShiftRows(AESS* aes, char state[0x04][0x04]) { aes->ShiftRows(state); }
}

AESClass.py

import ctypes

lib = ctypes.cdll.LoadLibrary('./libAESS.so')

class AESS():
    def __init__(self):
        lib.AESS_new.argtypes = []
        lib.AESS_new.restype = ctypes.c_void_p        

        lib.ShiftRows.argtypes=[ctypes.c_void_p , ?]
        lib.ShiftRows.restype= ctypes.c_void_p

        self.obj=lib.AESS_new()

    def ShiftRows(self, state):
        lib.ShiftRows(self.obj, state)

AES.py

import numpy as np
from AES import AESS

state=np.zeros((4,4))`

AES=AESS()

AES.ShiftRows(state)

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)