我需要将64位整数从DLL传递到函数中,但是本机python int类型为12个字节(sys.getsizeof(1)
返回12),并且出现错误“ ValueError:可能也调用了过程许多参数(超出4个字节)”。有没有办法初始化一个8字节的整数或转换为一个整数?
我尝试使用ctypes作为各种不同的ctype整数来传递参数,但是我无法使它起作用:
mydll.dllfn(c_int(1))
,mydll.dllfn(c_int64(1))
,mydll.dllfn(c_long(1))
等
我想避免使用gmpy,因为gmpy当前未维护或支持我所运行的平台。
答案 0 :(得分:2)
使用stdlib ctypes
:
>>> import ctypes
>>> ctypes.c_int64(1)
c_long(1)
它通常是c_longlong
的别名,代表C签名的long long数据类型。
>>> ctypes.c_int64 is ctypes.c_longlong
True
请注意,这些类型没有溢出检查!
>>> ctypes.c_int64(2**63-1)
c_long(9223372036854775807)
>>> ctypes.c_int64(2**63)
c_long(-9223372036854775808)
如果您想取消签名,则有ctypes.c_uint64
/ ctypes.c_ulonglong
。
根据界面的外观,您可能会对struct.pack
感兴趣:
>>> struct.pack('q', 2**63-1)
'\xff\xff\xff\xff\xff\xff\xff\x7f'
“ q”是指8字节整数类型(“ Q”是无符号的)。其他格式字符记录在here中。字节顺序,大小和对齐方式选项记录在here中。