buffer转int python_Python和C语言交互--ctypes,struct

本文介绍了如何使用ctypes和struct模块在Python中与C语言进行数据交互,特别是处理结构体和字节流。通过ctypes创建结构体并调用C动态库,同时讨论了字节对齐和字节序转换,以及memoryview在处理字节顺序转换中的应用。
摘要由CSDN通过智能技术生成

python和c语言进行数据交互,涉及类型转换,字节对齐,字节序大小端转换等。相关模块ctypes,struct,memoryview。

一.ctypes:python和c语言使用结构体数据进行交互

场景:有一个C语言生成的动态链接库,python需要调用动态库里的函数处理数据。函数的入参是结构体类型的指针,出参是一个buffer,那么如何把python的数据转换成c语言中的结构体类型?

1.ctypes的使用
C语言代码如下

#include <stdio.h>

typedef struct student{
    
    char name;
    short class;
    double num;
    int age;
}stu;

typedef struct stu_struct_array{
    
    stu stu_array[2];
}stu_struct_array_t;

int struct_test(stu *msg, stu_struct_array_t *nest_msg, char *buff){
    

    int index = 0;  

    printf("stu name: %dn", msg->name);
    printf("stu class: %dn", msg->class);
    printf("stu num: %fn", msg->num);
    printf("stu age: %dn", msg->age);

    memcpy(nest_msg->stu_array, msg, sizeof(stu));

    printf("stu array index 0 name: %dn", nest_msg->stu_array[0].name);
    printf("stu array index 0 class: %dn", nest_msg->stu_array[0].class);

    memcpy(buff, msg, sizeof(stu));
    printf("buff: %d %d", buff[0], buff[1]);

    return 1;
}

通过-fPIC -shared选项生成动态链接库,编译命令gcc -Wall -g -fPIC -shared -o libstruct.so.0 struct_array.c
此时需要通过python调用struct_test()函数,那么如何利用python传入结构体参数呢?
方法就是利用ctypes模块组装结构体(1)首先是结构体的组装

ctypes定义了一些和C兼容的基本数据类型:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值