高級語言調用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.pswp.cn/bicheng/76977.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/76977.shtml
英文地址,請注明出處:http://en.pswp.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…