Python3-ctypes:如何从字节数组中读取int



我正在为第三方DLL编写一个ctypes接口(我无法控制DLL(。

我已经到了可以将DLL函数的数据(写入我提供的缓冲区(放入Python字节数组的地步。

如何将字节数组中的字节转换为Python整数、字符串等?我知道如何使用暴力——例如(array[0]*256+array[1](,但这取决于机器的字节序和粗糙度。

做这件事的正确方法是什么?

我试图调用的C函数的签名是:

int GetData(int handle, unsigned short id, unsigned char* data, int dataLength, int &actualLength)

data指向缓冲区I供应,dataLength是以字节为单位的缓冲区长度。

DLL函数GetData()写入缓冲区,并将实际写入的字节数放入actualLength

它以int形式返回一个错误代码(0表示OK(。

到目前为止,这是我的代码-它似乎可以正常工作:

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'x01x01x00x12x00x00')

我知道前两个字节表示一个值为257的uint16。但是,如何以Python的方式从字节中读出这一点呢?

此外,我不确定我是否正确设置了.argtypes——我应该在什么时候使用c_char_p、c_void_p、.pointer和.byref?(尽管如此,这似乎确实有效。(我确实读过ctype文档,我知道他们说.byref更快,但我不清楚什么时候更喜欢.pointer。

只需使用int.from_bytes:

>>> buffer = bytearray(b'x01x01x00x12x00x00')
>>> int.from_bytes(buffer, 'big')
1103807774720
>>> int.from_bytes(buffer, 'little')
301990145

编辑:

仔细阅读您的问题,实际上您可能希望使用struct将字节解释为二进制压缩数据。在这种情况下,如果您需要读取无符号的16位整数

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

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

相关内容

  • 没有找到相关文章

最新更新