gpt4 book ai didi

python - python ctypes 结构的 c_int 成员只是整数?

转载 作者:行者123 更新时间:2023-12-01 05:25:58 29 4
gpt4 key购买 nike

我正在尝试为 CAN 通信 channel 创建一个 11 位 ID 字段。我想我应该能够使用:

import ctypes
class ID(ctypes.Union):
_fields_ = [('device', ctypes.c_int, 3), # 3 bits for device id
('message', ctypes.c_int, 8)] # 8 bits for message ID

问题是当我尝试验证此类的实例是否是我想要的时会发生什么。具体来说:

>>> x = ID()
>>> type(x.device)
<type 'int'>

为什么是 int 而不是 c_int?同样:

>>> x = ID()
>>> x.device.bit_length()
0

这正是我不想要的。

编辑:

感谢您的帮助!我绝对应该使用结构。

我正在尝试创建一个代表 CAN data frame 的标识符和数据部分的对象。 。我正在使用的约定将标识符帧进一步划分为 3 位和 8 位段,分别表示设备 ID 和消息 ID。我想要的是一个表示标识符框架的类,在其中我可以将值分配给与我的约定的设备和消息 ID 相对应的成员,并将其序列化为 11 位 ID 值。

也许我需要再看看我用于 CAN channel 的 C 库——可能我可以使用 16 位结构,但我只使用了 11 位。

最佳答案

Union内部,device成员使用8位存储。

但是,ctypes 会自动为您来回转换为 native int 类型,使用(很好的近似)通常的 C 规则在类型之间进行转换。例如,试试这个:

>>> x.device = 257
>>> x.device
1

所以,这里没有任何需要修复的内容。

<小时/>

但是,您确实有一个问题:

I'm trying to make an 11-bit ID field for a CAN communication channel.

8 位 int 和 3 位 int 的 Union 是 8 位,就像 C 中一样。您需要一个 Struct。请参阅Structures and unions以及从那里链接的类型引用以获取详细信息。

最重要的是,虽然 3 位 int 和 8 位 int 的 Struct 只有 11 位有用信息,但它几乎肯定会占用至少 16 位内存,带有 5 位填充。* 您一次只能对内存寻址一个字节(8 位)。所以……我不确定您到底想用这个 ID 做什么,但我怀疑它不会起作用。如果你解释一下your actual problem ,最好有一些 complete sample code ,我们或许可以提供帮助。

<小时/>

* 事实上,至少在当前的 CPython 版本中,它实际上会占用 32 位内存。有关更多详细信息,请参阅 eryksun 的评论。

关于python - python ctypes 结构的 c_int 成员只是整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21342865/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com