gpt4 book ai didi

python - 如何从非 ascii 字符获取 char 值

转载 作者:行者123 更新时间:2023-11-30 03:13:47 25 4
gpt4 key购买 nike

你好,所以我有一个 python 类型的字符串 POINTER(wintypes.BYTE) 我正在使用 DATA_BLOB在 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 写入文本文件,则不会出现此错误:

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 个问题后出现):您的缓冲区中有“特殊”char。这意味着您不应将 is 视为“普通字符串”,而应视为二进制序列(否则您可能会遇到编码/解码错误)。因此,以二进制模式打开要将其内容转储到的文件(例如: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 - 如何从非 ascii 字符获取 char 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58436070/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com