我需要将一个 64 位整数从 DLL 传递到一个函数中,但 native 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 维护或支持。
使用标准库 ctypes
:
>>> import ctypes
>>> ctypes.c_int64(1)
c_long(1)
通常是c_longlong
的别名, 表示 C signed 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 .
我是一名优秀的程序员,十分优秀!