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

4
我需要从DLL中传递一个64位整数到函数中,但是本机Python int类型为12字节(sys.getsizeof(1)返回12),我收到错误“ValueError:Procedure probably called with too many arguments(4 bytes in excess)”。有没有办法初始化8字节整数或将其转换为8字节整数?
我尝试使用ctypes将参数传递为各种不同的ctype整数,但我无法使其工作: mydll.dllfn(c_int(1)),mydll.dllfn(c_int64(1)),mydll.dllfn(c_long(1))等。
我想避免使用gmpy,因为我正在运行的平台目前未得到gmpy的维护或支持。

2
你能否更新你的问题,包括你用来调用函数的代码?ctypesint64long longuint64类型... - Sam Mason
2
本地的 Python 整数类型占用 12 字节... 嗯? - wim
1
Python语言没有任何X位整数的概念;它只支持任意精度整数。如果您需要将这样的整数作为8字节值传递,您需要相应地打包它;那么现在您得到了一个12字节的值,您要做什么呢? - chepner
1个回答

2
使用Python标准库中的 ctypes
>>> import ctypes
>>> ctypes.c_int64(1)
c_long(1)

通常它是c_longlong的别名,表示C语言中有符号长长整型数据类型。

>>> 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'表示无符号)。其他格式字符在 这里有文档。字节顺序、大小和对齐选项在这里有文档。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接