如何从非 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
你好所以我在 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