使用ctypes实现联合的困惑

时间:2014-02-03 02:25:47

标签: python c unions

我正在尝试使用ctypes编写union的代码,但它没有提供所需的输出......

代码:

#include<stdio.h>
int main()
{
  union a
  { 
    int i;
    char ch[2];
  };
  union a key;
  key.i=512;
  printf("%d\n",key.i);
  printf("%d\n",key.ch[0]);
  printf("%d\n",key.ch[1]);
  return 0;
}

预期产出:

512
0
2

我试过它:

#Demo of union at work
from ctypes import *
class a(Union):
    _fields_= [("i", c_int, 16),
               ("ch[2]",c_char)]
key=a()
key.i=512
print key.i
print key.ch[0]
print key.ch[1]

AttributeError: 'a' object has no attribute 'ch'

不知道为什么会出错?

任何实现它的方法?

1 个答案:

答案 0 :(得分:2)

你的联盟字段声明不正确。您已声明了名为"ch[2]"的属性。

为了证明这一点,请查看程序的这个变体:

#Demo of union at work
from ctypes import *
class a(Union):
    _fields_= [("i", c_int, 16),
               ("ch[2]",c_char)]
key=a()
key.i = 65
print getattr(key, "ch[2]")

<强>输出

A

你可能想写这样的代码:

_fields_= [("i", c_int, 16),
           ("ch", c_byte*2)]

这将ch声明为c_byte的数组,长度为2.

请注意,我使用c_byte代替c_char,因为您希望使用整数类型而不是字符。

所以,这是纠正的程序:

#Demo of union at work
from ctypes import *
class a(Union):
    _fields_= [("i", c_int, 16),
               ("ch",c_byte*2)]
key=a()
key.i=512
print key.i
print key.ch[0]
print key.ch[1]

<强>输出

512
0
2