V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
julyclyde
V2EX  ›  Python

struct array ctypes 怎么选

  •  
  •   julyclyde ·
    julyclyde · 2022-12-13 11:59:27 +08:00 · 2336 次点击
    这是一个创建于 740 天前的主题,其中的信息可能已经有所发展或是发生改变。

    涉及到一些二进制协议的通信,就是开头有长度、消息类型,然后各种类型分别按各自的定义来解析的那种

    我以前都是用 struct 今天读代码发现有人用 array 另外 ctypes 也听说过有人用的

    所以想请教一下这三个库各自的特长,如何根据场景来做选择

    9 条回复    2022-12-19 09:38:27 +08:00
    lookStupiToForce
        1
    lookStupiToForce  
       2022-12-13 16:03:18 +08:00
    lllllliu
        2
    lllllliu  
       2022-12-13 17:09:07 +08:00
    ```c
    typedef struct dsp_buf_t {
    uint16_t head;
    uint16_t buf_len;
    uint16_t cmd;
    uint16_t data_len;
    uint8_t data_and_crc[];
    } dsp_buf_t;

    static dsp_buf_t *get_buffer(size_t data_size, void *data, uint16_t cmd) {

    dsp_buf_t *buffer = lv_mem_alloc(sizeof(dsp_buf_t) + data_size + sizeof(uint8_t) * 2);
    buffer->head = 0X55AA;
    buffer->cmd = cmd;
    buffer->data_len = data_size;
    buffer->buf_len = buffer->data_len + 6; //cmd + data_len + data + crc
    lv_memcpy(buffer->data_and_crc, data, buffer->data_len);
    uint16_t crc = crc16_Count((uint8_t *) &buffer->cmd, buffer->data_len + 4);
    buffer->data_and_crc[buffer->data_len] = (crc >> 8) & 0xFF;
    buffer->data_and_crc[buffer->data_len + 1] = crc & 0xFF;
    return buffer;
    }

    ```
    julyclyde
        3
    julyclyde  
    OP
       2022-12-14 09:23:07 +08:00
    @lookStupiToForce 看过这篇了,感觉不太够……
    julyclyde
        4
    julyclyde  
    OP
       2022-12-14 09:24:15 +08:00
    @lllllliu 你这段,除了 55AA 之外,我一个字都不认识……
    lovelylain
        5
    lovelylain  
       2022-12-14 10:42:44 +08:00
    @julyclyde
    struct: python 结构与二进制序列化反序列化
    array: 高效数值数组
    ctypes: 调用 C 函数
    NoAnyLove
        6
    NoAnyLove  
       2022-12-18 02:05:38 +08:00
    相比于 struct ,ctypes 写起来肯定更 OOP ,更简单直观一些,当然也更慢一些。另外还可以用 cffi
    julyclyde
        7
    julyclyde  
    OP
       2022-12-19 08:59:21 +08:00
    @NoAnyLove cffi 好像在 cpython 里不是标准库,在 pypy 里算自带的?
    NoAnyLove
        8
    NoAnyLove  
       2022-12-19 09:36:22 +08:00
    @julyclyde 第三方库,可以用于 cpython 和 pypy 。是 pypy 的同一个团队开发的。
    julyclyde
        9
    julyclyde  
    OP
       2022-12-19 09:38:27 +08:00
    @NoAnyLove 哦,怪不得 pypy 内置了它
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2958 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 13:12 · PVG 21:12 · LAX 05:12 · JFK 08:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.