簡體   English   中英

如何從非 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。 加密數據后,數據保存在pbData結構的 pbData 中。 問題是pbData ( pbData[0] ) 中的值例如其中有-42 ,另一個例子是其中一些在 0 到 255 之間 - 它們很好,但有些是完全隨機數,我想不出了解如何將這些非 ASCII 數字轉換為字符。 在 c++ 中,我使用writeFile function 並且我只是發送pbData並且在 python 中一切正常,如果我嘗試將pbData寫入文本文件,則會出現此錯誤:

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

我真的不知道如何解決這個問題。

清單[Python 3.Docs]:ctypes - 用於 Python 的外部 function 庫

有幾個問題:

  • 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM