如何从非ASCII字符中获取字符值

时间:2019-10-17 15:28:21

标签: python c++ ascii ctypes

你好,我在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写入文本文件,则不会出现此错误:< / p>

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

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

1 个答案:

答案 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 指针(并且它们之间没有隐式转换)
  • 进一步(解决其他2个问题会出现):您的缓冲区中有“特殊” char 。这意味着您不应将其视为“正常字符串”,而应视为二进制序列(否则可能会出现编码/解码错误)。因此,请以 binary模式(例如: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