我正在尝试使用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
...