如何修复'ctypes.ArgumentError错误:参数2:<type'异常。类型错误“>:RaspberryPi中的类型错误”

2024-06-24 12:48:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我想创建一个C++库(.so),并在Python中使用它。 但是正如你所看到的,C++函数参数是固定大小数组。 如下图所示创建python源代码时, lib.ShiftRows.argypes=类型.c\u void\u p?] 我应该在“”中输入什么类型的数据部门?你知道吗

当实际使用上述类时,Python如何声明一个数组以声明与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 AESClass import AESS

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

aes = AESS()

aes.ShiftRows(state)

Tags: importself类型newforsolib数组
1条回答
网友
1楼 · 发布于 2024-06-24 12:48:23

签出[Python 3.Docs]: ctypes - A foreign function library for Python数组部分)。你知道吗

你可以这样做:

  • AESClass.py类

    CharArr4 = ctypes.c_char * 4
    CharArr4Arr4 = CharArr4 * 4
    
    class AESS():
    
    # ...
    
            lib.ShiftRows.argtypes = [ctypes.c_void_p , CharArr4Arr4]
    
  • AES.py公司(使用[SciPy]: numpy.ctypeslib.as_array(obj, shape=None)):

    import numpy as np
    from AESClass import AESS, CharArr4Arr4
    
    
    state_arr = CharArr4Arr4()  # Initialize the 4 X 4 array to 0
    aes = AESS()
    aes.ShiftRows(state_arr)
    
    state = np.ctypeslib.as_array(state_arr)
    

    或者反过来说:

    # ...
    state = np.zeros((4, 4), dtype=np.int8)
    # ...
    aes.ShiftRows(np.ctypeslib.as_ctypes(state))
    

相关问题 更多 >