struct array ctypes 怎么选

2022-12-13 11:59:27 +08:00
julyclyde  julyclyde

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

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

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

2387 次点击
所在节点   Python  Python
9 条回复
lookStupiToForce
lookStupiToForce
2022-12-13 16:03:18 +08:00
lllllliu
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
julyclyde
2022-12-14 09:23:07 +08:00
@lookStupiToForce 看过这篇了,感觉不太够……
julyclyde
julyclyde
2022-12-14 09:24:15 +08:00
@lllllliu 你这段,除了 55AA 之外,我一个字都不认识……
lovelylain
lovelylain
2022-12-14 10:42:44 +08:00
@julyclyde
struct: python 结构与二进制序列化反序列化
array: 高效数值数组
ctypes: 调用 C 函数
NoAnyLove
NoAnyLove
2022-12-18 02:05:38 +08:00
相比于 struct ,ctypes 写起来肯定更 OOP ,更简单直观一些,当然也更慢一些。另外还可以用 cffi
julyclyde
julyclyde
2022-12-19 08:59:21 +08:00
@NoAnyLove cffi 好像在 cpython 里不是标准库,在 pypy 里算自带的?
NoAnyLove
NoAnyLove
2022-12-19 09:36:22 +08:00
@julyclyde 第三方库,可以用于 cpython 和 pypy 。是 pypy 的同一个团队开发的。
julyclyde
julyclyde
2022-12-19 09:38:27 +08:00
@NoAnyLove 哦,怪不得 pypy 内置了它

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/902152

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX