python ctypes 指针_python:ctypes,python中的读取指针(c_char)

本文展示了如何使用Python的ctypes库来调用C动态链接库(DLL),并读取返回的结构体中包含的字符指针数据。通过创建对应的Python结构体,解析C库返回的指针内容,包括转换为字符串和直接访问原始字节序列。
摘要由CSDN通过智能技术生成

~5个

一行行代码,粘贴整个东西:

:

#include

#if defined(_WIN32)

# define DLL_EXPORT __declspec(dllexport)

#else

# define DLL_EXPORT

#endif

#define LEN 5

typedef struct CharPtrWrapperTag {

int len;

char *data;

} CharPtrWrapper;

DLL_EXPORT CharPtrWrapper *get() {

CharPtrWrapper *ret = malloc(sizeof(CharPtrWrapper));

ret->len = LEN;

ret->data = malloc(LEN * sizeof(char));

ret->data[0] = 'A';

ret->data[1] = 'B';

ret->data[2] = 0;

ret->data[3] = 'C';

ret->data[4] = 'D';

return ret;

}

DLL_EXPORT void release(CharPtrWrapper *pWrap) {

if (pWrap) {

free(pWrap->data);

pWrap->data = NULL;

pWrap->len = 0;

free(pWrap);

}

}

:

#!/usr/bin/env python3

import sys

import ctypes

DLL_NAME = "./dll.dll"

CharPtr = ctypes.POINTER(ctypes.c_char)

class CharPtrWrapper(ctypes.Structure):

_fields_ = [

("len", ctypes.c_int),

("data", CharPtr),

]

CharPtrWrapperPtr = ctypes.POINTER(CharPtrWrapper)

def main():

dll = ctypes.CDLL(DLL_NAME)

get = dll.get

get.restype = CharPtrWrapperPtr

release = dll.release

release.argtypes = [CharPtrWrapperPtr]

wrap_ptr = get()

wrap = wrap_ptr.contents

print("{:}\n Len: {:d}".format(wrap, wrap.len))

for idx in range(wrap.len):

print(" {:d}: {:}".format(idx, wrap.data[idx]))

s = ctypes.cast(wrap.data, ctypes.c_char_p).value[:wrap.len]

print("\nctypes.c_char_p cast: {:}".format(s))

CharArr = ctypes.c_char * wrap.len

char_arr = CharArr(*wrap.data[:wrap.len])

print("CharArr: {:}".format(char_arr.raw))

release(wrap_ptr)

print("\nDone.")

if __name__ == "__main__":

print("Python {:s} on {:s}\n".format(sys.version, sys.platform))

main()

输出

:

[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q055103298]> sopr.bat

*** Set shorter prompt to better fit when pasted in StackOverflow (or other) pages ***

[prompt]> "c:\Install\x86\Microsoft\Visual Studio Community\2015\vc\vcvarsall.bat" x64

[prompt]> dir /b

code.py

dll.c

[prompt]> cl /nologo /DDLL /MD dll.c /link /NOLOGO /DLL /OUT:dll.dll

dll.c

Creating library dll.lib and object dll.exp

[prompt]> dir /b

code.py

dll.c

dll.dll

dll.exp

dll.lib

dll.obj

[prompt]> "e:\Work\Dev\VEnvs\py_064_03.06.08_test0\Scripts\python.exe" code.py

Python 3.6.8 (tags/v3.6.8:3c6b436a57, Dec 24 2018, 00:16:47) [MSC v.1916 64 bit (AMD64)] on win32

Len: 5

0: b'A'

1: b'B'

2: b'\x00'

3: b'C'

4: b'D'

ctypes.c_char_p cast: b'AB'

CharArr: b'AB\x00CD'

Done.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值