gpt4 book ai didi

python-3.x - 在 bytes 和 POINTER(c_ubyte) 之间转换

转载 作者:行者123 更新时间:2023-12-05 05:07:49 27 4
gpt4 key购买 nike

如何在 Python 中的 bytesPOINTER(c_ubyte) 之间进行转换?

我想将 bytes 对象作为 POINTER(c_ubyte) 参数传递给 C 函数,并且我想使用返回的 POINTER(c_ubyte ) 作为字节

现在我正在使用:

data = b'0123'
converted_to = ctypes.cast(data, ctypes.POINTER(ctypes.c_ubyte))
converted_from = bytes(converted_to)

这似乎不太正确。我在 PyCharm 的 converted_to 行的 data 上收到警告:

Expected type 'Union[_CData, _CArgObject]', got 'bytes' instead

最佳答案

这是一个简单的 C++ 函数:

#define EXTERN_DLL_EXPORT extern "C" __declspec(dllexport)

EXTERN_DLL_EXPORT unsigned char* DoBytesStuff(const unsigned char* buffer, size_t buffer_size)
{
const auto new_buffer = new unsigned char[buffer_size];
memcpy(new_buffer, buffer, buffer_size);

for(size_t idx = 0; idx < buffer_size; idx++)
{
new_buffer[idx] += 1;
}

return new_buffer;
}

EXTERN_DLL_EXPORT void FreeBuffer(const unsigned char* buffer)
{
delete[] buffer;
}

所以基本上,它在输入中获取一个 unsigned char* 缓冲区,复制它,将副本中的每个元素加 1,然后返回复制的缓冲区。

现在对于 python:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import ctypes


def main():
dll = ctypes.WinDLL(r"TestDll.dll")

dll.DoBytesStuff.argtypes = [ctypes.POINTER(ctypes.c_ubyte), ctypes.c_size_t]
dll.DoBytesStuff.restype = ctypes.POINTER(ctypes.c_ubyte)
dll.FreeBuffer.argtypes = [ctypes.POINTER(ctypes.c_ubyte)]

buffer = bytes(range(0x100)) # 0 to 0xff
# ctypes instance that shares the buffer of the source object; use from_buffer_copy() to not share it
# note that we must use a bytearray because bytes object are immutable (and therefore not writable).
ubuffer = (ctypes.c_ubyte * len(buffer)).from_buffer(bytearray(buffer))

result = dll.DoBytesStuff(ubuffer, len(buffer))
b_result = ctypes.string_at(result, len(buffer))
print(b_result)

dll.FreeBuffer(result)

if __name__ == "__main__":
main()

(ctypes.c_ubyte * len(buffer)) 创建一个 c_ubyte 数组,然后用 from_buffer 初始化功能。 from_buffer 只接受一个可写对象,因此我们不能使用 bytes

至于返回,string_at直接从指针返回一个bytes对象。

关于python-3.x - 在 bytes 和 POINTER(c_ubyte) 之间转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58820531/

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