python3cTypes:如何从bytearray读取int?

5uzkadbs  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(399)

这个问题在这里已经有答案了

将字节转换为int(3个答案)
4小时前关门了。
我正在写一个ctypes接口到第三方dll(我没有对dll的控制)。
我已经到了可以将dll函数的数据(写入我提供的缓冲区)放入python bytearray的地步。
如何将bytearray中的字节转换成python整数、字符串等?我知道如何对其进行暴力-例如(数组[0]*256+数组[1]),但这取决于机器的持久性和粗糙度。
正确的方法是什么?
我试图调用的c函数的签名是:

int GetData(int handle, unsigned short id, unsigned char* data, int dataLength, int &actualLength)
``` `data` 指向我提供的缓冲区, `dataLength` 缓冲区的长度(字节)。
dll函数 `GetData()` 写入缓冲区,并输入实际写入的字节数 `actualLength` .
它以int形式返回错误代码(0表示正常)。
这是我目前的代码-它似乎工作到目前为止:

import ctypes

dll = ctypes.CDLL("dll_name.dll")

def GetData(handle, option_id):

BUFSIZE = 6

buffer = bytearray(BUFSIZE)

argument = (ctypes.c_char*len(buffer)).from_buffer(buffer)

actualLength = ctypes.c_int()

dll.GetData.argtypes = (ctypes.c_int, ctypes.c_ushort, 
                        ctypes.c_char_p, ctypes.c_int, ctypes.POINTER(ctypes.c_int))
dll.GetData.restype = int

r = dll.GetData(hCam, option_id, argument, BUFSIZE, ctypes.byref(actualLength))

if r:
    raise MyError(ERROR_CODES[r])

return (buffer, actualLength)
返回的缓冲区如下(例如):

bytearray(b'\x01\x01\x00\x12\x00\x00')

我知道前两个字节代表值为257的uint16。但是,如何从bytesarray中以一种python的方式读出这些信息呢?
另外,我不确定是否正确设置了.argtypes-何时应该使用c\u char\u p、c\u void\u p、.pointer和.byref(尽管如此,这似乎确实有效。)我确实读过ctype文档,我知道他们说。byref更快,但我不清楚什么时候首选。指针。
eoxn13cs

eoxn13cs1#

只是使用 int.from_bytes :

>>> buffer = bytearray(b'\x01\x01\x00\x12\x00\x00')
>>> int.from_bytes(buffer, 'big')
1103807774720
>>> int.from_bytes(buffer, 'little')
301990145

编辑:
仔细阅读你的问题,你可能真的想用 struct 将字节解释为二进制压缩数据。在这种情况下,如果你需要读取一个无符号的16位整数,

>>> import struct
>>> struct.unpack_from('H', buffer)
(257,)

注意,它返回一个 tuple 以处理更复杂的复合格式。这是文件

相关问题