如何从非 ascii 字符获取 char 值

How can you get char values from non ascii character

你好所以我在 python 中有一个字符串类型 POINTER(wintypes.BYTE) 我在 python 中使用 DATA_BLOB(

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 写入文本文件:

file.write(data_out.pbData)
TypeError: write() argument must be str, not LP_c_byte

我真的不知道如何解决这个问题。

清单[Python 3.Docs]: ctypes - A foreign function library for Python

有几个问题:

  • wintypes.BYTE 已签名 ([Python.Bugs]: wrong type for wintypes.BYTE)
  • file.write 适用于 Python 字符串(在你的情况下)而不是 ctypes 指针(并且没有它们之间的隐式转换)
  • 更进一步(这将在解决其他 2 个问题后出现):您的缓冲区中有 "special" chars。这意味着您不应将 is 视为 "normal string",而应视为二进制序列(否则您可能会遇到编码/解码错误)。因此,以 二进制模式 (例如: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