加载中…
正文 字体大小:

用ctypes定义嵌套structure和union时使用_anonymous_

(2010-12-20 19:26:20)
标签:

python

ctypes

anonymous

structure

it

分类: 计算机与 Internet

Creative Commons License
本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 Unported许可协议进行许可。允许非商业转载,但应注明作者及出处。
作者:xialulee
最初发布于:2010年12月20日,http://blog.sina.com.cn/xialulee
    写C程序时,有时候利用名为Anonymous Structure的特性定义structure和union,根据VC的文档,Anonymous Structures并不是标准C的特性。但是VC和GCC都支持这种用法。在Python的ctypes中,我们可以用_anonymous_来实现类似的效果。
    以我们经常用的FloatBits为例,利用它可以操作浮点数的各个位域,包括符号位,指数域,尾数域。我们的Python版的eps函数就是用它来实现的,参见《关于Matlab的eps函数(七)——“又续”的续》
    以前的FloatBits是这样定义的:
import ctypes as ct

class FloatBits(ct.Union):
    class _Bits(ct.Structure):
        _fields_ [('M'ct.c_uint, 23),
                   ('E'ct.c_uint, 8),
                   ('S'ct.c_uint, 1)
                   ]
    _fields_ [('value'ct.c_float),
               ('bits'_Bits)
               ]

如果我们想访问浮点数的各个位域,必须以fb.bits.S, fb.bits.E, fb.bits.M这样的形式进行访问,如:
>>> fb = FloatBits()
>>> fb.value = 12.5
>>> fb.bits.S = 1
>>> fb.value
-12.5

下面是使用了anonymous的FloatBits:
import ctypes as ct

class FloatBits(ct.Union):
    class _Bits(ct.Structure):
        _fields_ [('M'ct.c_uint, 23),
                   ('E'ct.c_uint, 8),
                   ('S'ct.c_uint, 1)
                   ]
    _anonymous_ ('bits')
    _fields_ [('value'ct.c_float),
               ('bits'_Bits)
               ]

用了anonymous之后,就不必通过fb.bits来访问位域了,可以直接用fb.S, fb.E, fb.M这样的方式进行访问:
>>> fb.value = 12.5
>>> fb.S = 1
>>> fb.value
-12.5

这个使用了anonymous的FloatBits等价于C中的:
typedef union{
  struct{
    unsigned 23;
    unsigned 8;
    unsigned 1;
  };
  float value;
}FloatBits;


0

阅读 评论 收藏 转载 喜欢 打印举报
已投稿到:
  • 评论加载中,请稍候...
发评论

       

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 不良信息反馈 电话:4006900000 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有