Python读写C语言数据结构 – ctypes 和 struct 库

python.webp

Python 的外部函数库 ctypes

  • ctypes 是 Python 的外部函数库。它提供了与 C 兼容的数据类型,并允许调用 DLL 或共享库中的函数。可使用该模块以纯 Python 形式对这些库进行封装。

ctypes.png

本文只用到 ctypes 模块中的结构体 Structure 与 C 兼容数据类型

Python 的外部函数库 ctypes结构体和联合

结构体和联合必须继承自 ctypes 模块中的 Structure 和 Union 。子类必须定义 fields 属性。 fields 是一个二元组列表,二元组中包含 field name 和 field type 。

type 字段必须是一个 ctypes 类型,比如 c_int,或者其他 ctypes 类型: 结构体、联合、数组、指针。

这是一个简单的 POINT 结构体,它包含名称为 x 和 y 的两个变量,还展示了如何通过构造函数初始化结构体。

from ctypes import *
class POINT(Structure):
    _fields_ = [("x", c_int),
                ("y", c_int)]

point = POINT(10, 20)
print(point.x, point.y)

point = POINT(y=5)
print(point.x, point.y)

POINT(1, 2, 3)

python读写C语言数据结构.py 实验源码

C 语言定义的结构体 struct gps 在Python中对应写成 class Location(Structure)

struct gps { 
  double x; double y; };

class Location(Structure):
    _fields_ = [('lon', c_double), ('lat', c_double)]

pybin.py Python 使用 C数据结构,把一个gps坐标写到文件中。

pybin.py

fread.c 使用C语言程序读取数据文件,验证写文件是否正确

fread.c

pybin_read.py Python 读取C数据结构文件后,需要使用 struct 库进行二进制数据转换

pybin_read.py

将字节串解读为打包的二进制数据 struct

  • 此模块可以执行 Python 值和以 Python bytes 对象表示的 C 结构之间的转换。
    这可以被用来处理存储在文件中或是从网络连接等其他来源获取的二进制数据。

它使用 格式字符串 作为 C 结构布局的精简描述以及与 Python 值的双向转换。

aa = struct.pack("4B", 1, 2, 3, 4)
print(aa)
bb = struct.unpack("f", aa)
print(bb)

fmt.png

Python读写C语言数据结构 总结精简

import struct
from ctypes import *
class Location(Structure):
    _fields_ = [('lon', c_double), ('lat', c_double)]

f = open("gps.dat", "rb")
t = f.read(16) ; print(t)
t = struct.unpack("2d", t) ; print(t)
gps =Location(lon=t[0], lat=t[1])
print(gps.lon, gps.lat)
© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论