【发布时间】:2019-10-17 15:28:21
【问题描述】:
你好,所以我在 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 之间 - 它们很好,但有些完全是随机数,我可以t 弄清楚如何将这些非 ASCII 数字转换为字符。在 c++ 中,我使用 writeFile 函数,我只发送 pbData 并且在 python 中一切正常,如果我试图将 pbData 写入文本文件,我会遇到此错误:
file.write(data_out.pbData)
TypeError: write() argument must be str, not LP_c_byte
我真的不知道如何解决这个问题。
【问题讨论】:
-
我认为
wintypes.BYTE是signed char或char(通常也是签名的)。你真的得到了介于 128 和 255 之间的wintypes.BYTE值吗? -
在 Windows 中,
BYTE是unsigned(0-255)。wintypes.BYTE已签名 (128-127)。如果wintypes.BYTE为负数,您只需将 256 添加到它即可获得与 C++ 中相同的值(在 2 的补码机器上)。 -
它使用你想要的类型。在 Windows (C++) 中,
BYTE定义为unsigned char。不幸的是,wintypes.BYTE没有映射到任务的正确类型(因为它由于某种原因被烧掉了)。在查看ctypes/wintypes.py时,我看到有一个UCHAR类型 - 但它已被注释掉。否则,我会尝试使用它。 -
@TedLyngmo 非常感谢
-
好吧,在你做了 +256 之后,你的值应该在 0 到 255(包括)之间。如果这还不够,您还有其他问题可以通过以二进制模式写入文件来解决(请参阅@CristiFati 的回答)。