你好,我在python类型为POINTER(wintypes.BYTE)
中有一个字符串,我在python(
class CREATE_DATA_BLOB(Structure):
_fields_ = [('cbData', wintypes.DWORD), ('pbData', POINTER(wintypes.BYTE))]
),所以我有一个加密数据的DLL。加密数据后,数据将保存在data_blob结构的pbData
内部。问题是pbData
(例如pbData[0]
)中的值包含-42
,例如,其中一些值介于0到255之间-很好,但有些则完全随机数字,我不知道如何将这些非ASCII数字转换为字符。在c ++中,我使用writeFile函数,并且只发送pbData
,而在python中一切正常,如果我尝试将pbData
写入文本文件,则不会出现此错误:< / p>
file.write(data_out.pbData)
TypeError: write() argument must be str, not LP_c_byte
我真的不知道如何解决这个问题。
答案 0 :(得分:2)
列出[Python 3.Docs]: ctypes - A foreign function library for Python。
有几个问题:
wintypes.BYTE
已签名([Python.Bugs]: wrong type for wintypes.BYTE)file.write
使用 Python 字符串(在您的情况下)而不是 ctypes 指针(并且它们之间没有隐式转换)file = open(file_name, "wb")
)打开要将其内容转储到的文件。>>> import ctypes as ct >>> from ctypes import wintypes as wt >>> >>> class CREATE_DATA_BLOB(ct.Structure): ... _fields_ = [ ... ("cbData", wt.DWORD), ... ("pbData", ct.POINTER(ct.c_ubyte)), # wt.BYTE is signed !!! ... ] ... >>> >>> buf_initial = b"AB\xD6CD\xD9EF\x9CGH" # Contains the 3 chars you mentioned >>> buf_initial b'AB\xd6CD\xd9EF\x9cGH' >>> # Populate the structure as it was done from C++ ... >>> blob = CREATE_DATA_BLOB(len(buf_initial), ct.cast(ct.create_string_buffer(buf_initial), ct.POINTER(ct.c_ubyte))) >>> blob.cbData, blob.pbData (11, <__main__.LP_c_ubyte object at 0x00000154FF6998C8>) >>> >>> buf_final = bytes(blob.pbData[:blob.cbData]) # Convert the pointer explicitly to Python bytes >>> buf_final b'AB\xd6CD\xd9EF\x9cGH' >>> buf_initial == buf_final True >>> >>> with open("q058436070_out.bin", "wb") as file: ... file.write(buf_final) ... 11