如何在不使用gmpy的情况下获取64位整数?

时间:2019-01-09 16:20:03

标签: python python-2.7

我需要将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当前未维护或支持我所运行的平台。

1 个答案:

答案 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中。