You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用ctypes实现libnfc的Python-C绑定:结构体size_t字段定义问题

解决ctypes绑定libnfc时nfc_iso14443a_info结构体的类型匹配问题

你这里的核心问题是对C中size_t类型的ctypes对应关系理解错了——原来的代码把szUidLen定义成了c_uint8 * 8(一个8字节的uint8数组),但实际上C头文件里的size_t szUidLen;是一个单独的平台相关无符号整数,不是数组。

修正后的结构体定义

直接用ctypes提供的c_size_t来匹配C的size_t类型,这才是正确的对应方式:

from ctypes import Structure, c_uint8, c_size_t

class nfc_iso14443a_info(Structure):
    _fields_ = [
        ('abtAtqa', c_uint8 * 2),
        ('btSak', c_uint8),
        ('szUidLen', c_size_t),  # 这里改成c_size_t,匹配C的size_t
        ('abtUid', c_uint8 * 10),
        # 其他字段保持不变
    ]

补充说明

  • size_t是C标准里定义的平台依赖无符号整数,通常32位系统上是4字节,64位系统上是8字节,用ctypes的c_size_t能自动适配不同平台,比手动硬写c_uint64更靠谱(毕竟有些平台的size_t不一定是64位)。
  • 你提到需要szUidLen的值等于7,现在改成c_size_t后,直接给这个字段赋值7就可以了,比如:
    info = nfc_iso14443a_info()
    info.szUidLen = 7
    
  • 结构体的字段顺序和类型必须和nfc-types.h里的定义完全一致,否则会出现内存偏移错误,导致读取/写入数据异常。

内容的提问来源于stack exchange,提问作者Grief

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:11:04