COM调用:OverflowError:Python int太大而无法转换为C long

时间:2013-12-12 07:39:19

标签: python com win32com

我正在尝试使用win32com Python(v3.3)库调用COM方法。此方法接受地址和数据写入该地址。

SWDIOW(IN addr, IN data)

问题是:数据的可接受大小是32位。当我用这样的参数调用这个方法时没有问题:

swdiow(0x400c0000, 0x00000012)

但是当数据太大(实际上大于2 ^( - 31)-1)时,例如;

swdiow(0x400c0000, 0xF3804770)

发生这种情况:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\WinPython\python-3.3.2.amd64\lib\site-packages\win32com\gen_py\97FF1B53-6477-4BD1-8A29-ADDB58E862E5x0x16x0.py", line 1123, in swdiow
    , data)
OverflowError: Python int too large to convert to C long

我认为发生这个问题是因为python将0xF3804770作为有符号整数。该值需要32位表示为无符号。为了使其签名,Python再添加一个符号位,0xF3804770的大小变为33位。由于该符号位,它无法转换为C long类型,我相信它的大小为32位。

我找到了一个解决方法,当它太大时会将数字转换为负整数。

>> int.from_bytes((0xF3804770).to_bytes(4,'big',signed=False),'big', signed=True)
-209696912

也许这是我能做的最好的事情,但我想知道是否有更优雅的解决方案呢?

顺便说一句,我的'data'的来源是一个文本文件,其中包含4个字节的HEX值,例如;

D0010880
D1FD1E40
F3EF4770
431103C2
...

0 个答案:

没有答案