如何将ctypes argtypes c_ubytes用于无符号字符*? 我是Python的新手,我尝试使用C++模块作为AES库::AES。h。 它包含一个字节定义为无符号字符的模块: void AES::set_IV(unsigned long long int IVCl){ memcpy(iv,&IVCl,8); memcpy(iv+8,&IVCl,8); IVC = IVCl; } void AES::get_IV(byte *out){ memcpy(out,&IVC,8); memcpy(out+8,&IVC,8); } void AES::iv_inc(){ IVC += 1; memcpy(iv,&IVC,8); memcpy(iv+8,&IVC,8); }
我尝试了一些在Python中使用它的代码:如何将ctypes argtypes c_ubytes用于无符号字符*? 我是Python的新手,我尝试使用C++模块作为AES库::AES。h。 它包含一个字节定义为无符号字符的模块: void AES::set_IV(unsigned long long int IVCl){ memcpy(iv,&IVCl,8); memcpy(iv+8,&IVCl,8); IVC = IVCl; } void AES::get_IV(byte *out){ memcpy(out,&IVC,8); memcpy(out+8,&IVC,8); } void AES::iv_inc(){ IVC += 1; memcpy(iv,&IVC,8); memcpy(iv+8,&IVC,8); },python,c++,ctypes,Python,C++,Ctypes,我尝试了一些在Python中使用它的代码: from ctypes import * import ctypes import numpy import glob libfile = glob.glob('build/*/AES.so')[0] mylib = ctypes.cdll.LoadLibrary(libfile) x = c_ulonglong(22222222) y = numpy.ctypeslib.as_array(x) iv = (c_ubyte * 16)() my_i
from ctypes import *
import ctypes
import numpy
import glob
libfile = glob.glob('build/*/AES.so')[0]
mylib = ctypes.cdll.LoadLibrary(libfile)
x = c_ulonglong(22222222)
y = numpy.ctypeslib.as_array(x)
iv = (c_ubyte * 16)()
my_iv = (ctypes.c_ubyte * 16)(0)
pointer_type =ctypes.POINTER(ctypes.c_ubyte)
pointer = ctypes.cast(my_iv, pointer_type)
mylib._ZN3AES6set_IVEy.argtypes = [numpy.ctypeslib.ndpointer(dtype = ctypes.c_ulonglong)]
mylib._ZN3AES6set_IVEy.restype = None
mylib._ZN3AES6set_IVEy(y) # the set_IV C++ func
mylib._ZN3AES6iv_incEv.restypes = None
mylib._ZN3AES6iv_incEv() # the iv_inc C++ func
print("OK")
mylib._ZN3AES6get_IVEPh.argtypes =[(pointer_type)]
mylib._ZN3AES6get_IVEPh(pointer) # the get_IV C++ func
print("OK")
结果是:[在此处输入图像描述][1]
这意味着前两个功能已完全运行,但最后一个分段故障意味着发生了错误。我在网上搜索过这个,但仍然不知道这个。
此外,我在raspberry pi上使用python3编写代码。
你能告诉我这个问题吗?谢谢
[1]:
CTypes代表C(不是C++)类型。你应该寻找其他的选择(PyBind11,Cython,SWIG等等)。对不起,这是我的错。我会检查你建议的选项。谢谢你的帮助。但是你能告诉我为什么上面两个函数可以正常运行吗?我试过了,它运行。可能是因为C++指针与C指针(简单地址)相同。如果你只需要它可能会起作用(虽然不建议这样做),但是如果你想更深入,问题就开始了。好的,我明白了。谢谢Cristi.CTypes代表C(不是C++)类型。你应该寻找其他的选择(PyBind11,Cython,SWIG等等)。对不起,这是我的错。我会检查你建议的选项。谢谢你的帮助。但是你能告诉我为什么上面两个函数可以正常运行吗?我试过了,它运行。可能是因为C++指针与C指针(简单地址)相同。如果你只需要它可能会起作用(虽然不建议这样做),但是如果你想更深入,问题就开始了。好的,我明白了。谢谢你,克里斯蒂。