将XML保存为变量中的ctypes c_byte会产生TypeError:需要一个整数

时间:2015-01-25 20:48:35

标签: python c xml ctypes

在C头文件中我有:

long TEST_API test (    
                        ___OUT_ char DisplayText[41],
                        _IN____ const char XMLparams[2049]
                        );

在python代码中,我导入了ctypes,我试图调用"测试"。

class A(Structure):
    _fields_ = [("DisplayText", c_byte*41), 
                ("XMLparams",c_byte*2049)
            ]

XMLparamsVal = (ctypes.c_byte*2049)(["<xml><MatchboxDataProviderValue>Openvez</MatchboxDataProviderValue><AlwaysPrintTwoTicketsFlag>FALSE</AlwaysPrintTwoTicketsFlag><DisplayWidthInCharacters>20</DisplayWidthInCharacters><!-- exclude Ikea-Card and Maestro from PAN truncation --><DontTruncateList>*119*1*</DontTruncateList></xml>"])

my_A = A("", XMLparamsVal)

lib.test(my_A.DisplayText, my_A.XMLparams)

我正在接受这个错误:

XMLparamsVal = (ctypes.c_byte*2049)(["<xml><MatchboxDataProviderValue>Openvez</MatchboxDataProviderValue><AlwaysPrintTwoTicketsFlag>FALSE</AlwaysPrintTwoTicketsFlag><DisplayWidthInCharacters>20</DisplayWidthInCharacters><!-- exclude Ikea-Card and Maestro from PAN truncation --><DontTruncateList>*119*1*</DontTruncateList></xml>"])  
TypeError: an integer is required

我该如何解决这个问题。谢谢!

1 个答案:

答案 0 :(得分:0)

c_byte数组将可变数量的int s作为参数,您试图给它一个列表。试试这个:

xml_bytes = bytearray(b'<xml>...')
XMLparamsVal = (ctypes.c_byte*2049)(*xml_bytes)

*xml_bytes扩展为一系列位置int参数。

对于python3,你不需要bytearray,你可以直接使用字节文字,就像在python3中迭代一个byte对象产生int s:

XMLparamsVal = (ctypes.c_byte*2049)(*b'<xml>...')

请注意,对于A课程的第一个参数,您还必须传递c_byte_Array_41,而不是字符串。