2016-08-08 19 views
2

私はctypes.BigEndianStructureに問題があります。フィールドに設定した値を取得できません。私のコードはこのようなものです。除外としてPython ctypes.BigEndianStructureは値を保存できません

import ctypes 
class MyStructure(ctypes.BigEndianStructure): 
    _pack_ = 1 
    _fields_ = [ 
     ('fx', ctypes.c_uint, 7), 
     ('fy', ctypes.c_ubyte, 1) 
    ] 

x = MyStructure() 

それは0を出力します。

print x.fy # Prints 0 

が、私はそれに値を設定するが、それはまだ0を出力します。

x.fy = 1 
print x.fy # Still prints 0 
+0

再生できません。あなたの正確なコードを貼り付け、Python 2.7.5(32ビット)を使用しました。 –

+0

さらに重要なことに、 'ctypes.sizeof(MyStructure)'を期待どおりにチェックしてください。現在の定義は5バイトです。 1バイトをパックしようとするならば、 'fx'と' fy'は 'c_ubyte'でなければなりません。異なるタイプを使用すると、新しいパッキングが開始されます。 –

+0

Python 3.3(64ビット)でもそのまま動作します。再現するための詳細が必要です。 –

答えて

-1

私はあなたがdoesnのをやって、なぜかわかりませんそれは確かに奇妙な行動です。私はこの代替コードが動作すると思います。

import ctypes 
class MyStructure(ctypes.BigEndianStructure): 
    _pack_ = 1 
    def __init__(self): 
     self.fx=ctypes.c_uint(7) 
     self.fy = ctypes.c_ubyte(1) 

x = MyStructure() 
x.fy = 7 
print x.fy # prints 7 

またはコンストラクタなし::

import ctypes 
class MyStructure(ctypes.BigEndianStructure): 
    _pack_ = 1 
    fx = ctypes.c_uint(7) 
    fy = ctypes.c_ubyte(1) 

x = MyStructure() 
x.fy = 7 
print x.fy # prints 7 

私は奇妙な行動に話すことができないので、私はフィールド属性を使用していない個人的に決してしています。

+0

このコードはオリジナルとは異なる意味を持ちます。 OPが使用するシンタックスはビットパッキング用です。このコードは、完全なintとubyteを非標準的な方法で宣言します。 '_fields_'を使うべきです。そうでないと、' ctypes.sizeof'のようなものが正しく動作しません(ゼロを返します)。 –

関連する問題