편집 기록

편집 기록
  • 프로필 nowp님의 편집
    날짜2019.09.18

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


    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)
    
  • 프로필 알 수 없는 사용자님의 편집
    날짜2019.09.17

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


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

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

    그리고 실제로 아래의 AESClass.py의 AESS 클래스를 사용할 때 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)