高级语言调用C接口(四)结构体(2)-Python

这个专栏好久没有更新了,主要是坑开的有点大,也不知道怎么填,涉及到的开发语言比较多,写起来比较累,需要看的人其实并不多,只能说,慢慢填吧,中间肯定还会插很多别的东西,更新频率自己也不知道。

上一次说了Java和C#调用C接口传递结构体,今天来说一下Python。由于鸿蒙并不需要在arkts层真正的定义结构体,Napi层可以通过Json转结构体的方式来实现,还没想好怎么去举例子,下次再说吧。

Python这种脚本语言并没有结构体的概念,所以我们要用到Python的ctypes包中的Structure。

和Java、C#一样,由于高级语言的结构与C的结构体并不完全一样,高级语言的类包含方法,而C的结构体是定义即所见,所以C接口直接调用高级语言的结构体数组地址时,会崩溃,Python也和C#、Java一样,定义为数组并赋值,再将数组转换为连续内存。

from ctypes import *
import sys# 定义结构体(需与C头文件完全一致)
class stGoodsInfo(Structure):_fields_ = [("goodsId", c_char_p),("goodsName", c_char_p),("quantity", c_char_p),("price", c_char_p),("goodsCategory", c_char_p),("body", c_char_p),("discount", c_char_p),("unit", c_char_p)]class stOrderInfo(Structure):_fields_ = [("merOrderId", c_char_p),("srcReserve", c_char_p),("orderDesc", c_char_p),("totalAmount", c_char_p),("goodsNum", c_int),("pstGoodsInfo", POINTER(stGoodsInfo)),("attachedData", c_char_p)]# 加载动态库(示例名称,需替换实际库路径)
lib = CDLL("XXX.so")  # Linux/Mac
# lib = WinDLL("XXX.dll")  # Windows# 定义函数原型
lib.PalmPay.argtypes = [POINTER(stOrderInfo)]
lib.PalmPay.restype = Nonedef main():# 创建商品数组(保持内存连续)goods_array = (stGoodsInfo * 2)()# 填充第一个商品goods_array[0] = stGoodsInfo(goodsId=b"SDGOOD000001",goodsName="哇哈哈矿泉水".encode('utf-8'),quantity=b"2",price=b"2.00",goodsCategory="食品饮料".encode('utf-8'),body="饮料".encode('utf-8'),discount=b"0",unit="瓶".encode('utf-8'))# 填充第二个商品goods_array[1] = stGoodsInfo(goodsId=b"SDGOOD000002",goodsName="百岁山矿泉水".encode('utf-8'),quantity=b"2",price=b"3.00",goodsCategory="食品饮料".encode('utf-8'),body="饮料".encode('utf-8'),discount=b"0",unit="瓶".encode('utf-8'))# 创建订单结构体order = stOrderInfo()order.merOrderId = b"SD000000000000001"order.srcReserve = b"aaaaaaaaaaaaaa"order.orderDesc = b"Test"order.totalAmount = b"10.00"order.attachedData = b"attachedData test"order.goodsNum = 2order.pstGoodsInfo = cast(goods_array, POINTER(stGoodsInfo))  # 关键指针转换# 调用C接口(传递结构体指针)lib.PalmPay(byref(order))if __name__ == "__main__":main()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/76977.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA 主流微服务常用框架及简介

Java微服务架构的优势在于其轻量级、高效资源利用,支持快速开发与灵活部署,拥有强大的生态系统与跨平台兼容性,能够实现高性能与稳定性,并允许独立扩展与技术栈多样性。然而,其劣势也不容忽视,包括架构复杂…

儿童后期至青少年早期脑网络隔离增强的发育机制研究

目录 1 研究背景 2 研究方法 2.1 纵向数据集 2.2 图像预处理 2.3 个体化区域放射组学相似网络构建 2.4 分离度(模块化)度量 2.5 分离度指数发育变化的建模 2.6 分离指数与认知表现的相关性分析 2.7 成像转录组分析 3 研究结果 3.1 三个尺度上…

redis 内存中放哪些数据?

在 Java 开发中,Redis 作为高性能内存数据库,通常用于存储高频访问、低延迟要求、短期有效或需要原子操作的数据。以下是 Redis 内存中常见的数据类型及对应的使用场景,适合面试回答: 1. 缓存数据(高频访问,降低数据库压力) 用户会话(Session):存储用户登录状态、临时…

Spring AOP 学习笔记 之 Advice详解

学习材料:https://docs.spring.io/spring-framework/reference/core/aop/ataspectj/advice.html 1. 什么是 Advice(通知) 定义:Advice 是 AOP 的核心概念之一,表示在特定的连接点(Join Point)上…

数智读书笔记系列029 《代数大脑:揭秘智能背后的逻辑》

《代数大脑:揭秘智能背后的逻辑》书籍简介 作者简介 加里F. 马库斯(Gary F. Marcus)是纽约大学心理学荣休教授、人工智能企业家,曾创立Geometric Intelligence(后被Uber收购)和Robust.AI公司。他在神经科学、语言学和人工智能领域发表了大量论文,并著有《重启AI》等多部…

如何看电脑的具体配置?

李升伟 整理 要查看电脑的具体配置,可以通过系统工具、命令行工具或第三方软件实现,以下是具体方法: 一、系统自带工具查看(无需安装软件) Windows系统: 系统设置: 右键点击桌面“此电脑”…

开源TTS项目GPT-SoVITS,支持跨语言合成、支持多语言~

简介 GPT-SoVITS 是一个开源的文本转语音(TTS)项目,旨在通过少量语音数据实现高质量的语音合成。其核心理念是将基于变换器的模型(如 GPT)与语音合成技术(如 SoVITS,可能指“唱歌语音合成”&am…

D1084低功耗LDO稳压器:技术解析与应用设计

引言 在现代电子设计中,低功耗和高效率是至关重要的。D1084是一款5A低功耗低压差线性稳压器(LDO),以其出色的负载调节能力和快速瞬态响应,成为低电压微处理器应用的理想选择。本文将深入解析D1084的技术特性和应用设计…

Log4j详解:Java日志系统全指南

文章目录 1. 日志系统简介1.1 什么是日志1.2 为什么使用日志框架1.3 Java中的常见日志框架 2. Log4j概述2.1 Log4j简介2.2 Log4j的版本历史2.3 Log4j与Log4j 2的主要区别 3. Log4j架构与核心组件3.1 Logger(日志记录器)3.2 日志级别(Level&am…

【信息系统项目管理师】高分论文:论信息系统项目的整合管理(银行数据仓库项目)

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 正文一、制定项目章程二、制定项目管理计划三、指导和管理项目的实施四、管理项目知识五、监控项目工作六、实施整体变更控制七、结束项目或阶段正文 2023年6月,我以项目经理的身份,参加了 xx银行xx省分行数…

sql server 预估索引大小

使用deepseek工具预估如下: 问题: 如果建立一个数据类型是datetime的索引,需要多大的空间? 回答: 如果建立一个数据类型是 datetime 的索引,索引的大小取决于以下因素: 索引键的大小&#…

干货 | 高性能 Nginx 优化配置总结

文章目录 一、前言二、配置优化2.1 并发处理架构优化2.1.1 工作进程配置2.1.2 事件驱动模型 2.2 传输效率优化2.2.1 零拷贝技术2.2.2 长连接复用 2.3 缓存体系构建2.3.1 文件描述符缓存2.3.2 代理缓存2.3.3 静态资源缓存 2.4 协议层深度优化2.4.1 HTTP/2 支持2.4.2 TLS优化 2.5…

ES DSL 常用修改语句

字段值替换修改 修改sql update zyzkwjj set dhreplace(dh,"WS","WSS") where dh like %WS% update zyzkwjj set dh replace(dh, WS, DZ),ztm replace(ztm, WS, DZ),zrz replace(zrz, WS, DZ) where dh like %WS% or ztm like %WS% or zrz like %WS%…

Vue 3 的组合式 API-hooks

Vue 3 的组合式 API 组合式 API 是 Vue 3 的核心特性之一,它允许开发者将组件的逻辑拆分为可复用的函数。组合式 API 的主要特点是 逻辑复用:将逻辑提取到独立的函数中,方便在多个组件中复用。组织清晰:将相关的逻辑分组&#x…

Web渗透之XSS注入

XSS的类型 1、反射型XSS 我们构建好一个urlXSS的payload,发送给受害者,受害者点击恶意链接后会在受害者的浏览器上执行恶意代码。反射型XSS是一次性的,而且比较容易被发现。通常恶意链接会被修改成短链接,或钓鱼图片的形式。 2…

【Nginx】Nginx代理Tomcat配置及404问题解决

当Tomcat返回HTTP 404未找到错误时,可以通过以下两种方式设置跳转到指定地址: ① 在Tomcat应用内部配置错误页面跳转(直接修改Tomcat的Web应用配置) ② 在Nginx反向代理层拦截404错误并跳转(无需修改Tomcat&#xff0c…

某公司网络OSPF单区域配置

1.配置背景: xx公司网络由三台路由器和一台交换机组成,现在想要三台路由器之间通过OSPF实现互连互通。 2.网络结构如下: 3.具体配置: 3.1路由器 RA 配置: 1.更改主机名称: Router>en Router#conf t…

电脑知识 | TCP通俗易懂详解 <一>

目录 一、👋🏻前言 二、🚍什么是TCP/TCP协议 三、🧍‍♂为什么TCP可靠 1.🥰关于可靠 2.🤠哪里可靠 3.🎓️图片的三次握手,四次挥手 4.📚️知识点总结 四、&…

MyBatis 中 Mapper 传递参数的多种方法

# MyBatis Mapper 传递参数的多种方法及其优势 在使用 MyBatis 进行数据库操作时,Mapper 接口的参数传递是一个非常基础但又十分重要的部分。不同的参数传递方式适用于不同的场景,合理选择可以大大提高代码的可读性和维护性。本文将详细介绍几种常见的 …

Dify 插件开发笔记

Dify 插件开发 开发流程 #mermaid-svg-U9rSMmcbWvcGcFMu {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-U9rSMmcbWvcGcFMu .error-icon{fill:#552222;}#mermaid-svg-U9rSMmcbWvcGcFMu .error-text{fill:#552222;st…