2016-08-08 8 views
2

Ich habe Probleme mit ctypes.BigEndianStructure. Ich kann den Wert, den ich auf eins gesetzt habe, nicht auf die Felder bekommen. Mein Code ist so.Python ctypes.BigEndianStructure kann keinen Wert speichern

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

x = MyStructure() 

Er druckt 0 als ausgenommen:

print x.fy # Prints 0 

dann setze ich einen Wert zu, aber er druckt immer noch 0:

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

Kann nicht reproduziert werden. Ich habe Ihren genauen Code eingefügt und Python 2.7.5 (32-Bit) verwendet. –

+0

Noch wichtiger, sollten Sie die 'ctypes.sizeof (MyStructure)' überprüfen, da es wahrscheinlich nicht das ist, was Sie erwarten. Die aktuelle Definition ist 5 Bytes. Wenn Sie versuchen, ein Byte zu packen, sollten 'fx' und' fy' 'c_ubyte' sein. Mit einem anderen Typ beginnt eine neue Verpackung. –

+0

Funktioniert auch wie in Python 3.3 (64-Bit). Benötigen Sie mehr Details zum Reproduzieren. –

Antwort

-1

Ich weiß nicht, warum das, was doesn Ihr tut Es funktioniert nicht und es ist sicherlich seltsames Verhalten. Ich denke, dass dieser alternative Code funktioniert.

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 

oder ohne den Konstruktor ::

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 

Ich habe persönlich verwendet nie die Felder Attribute so dass ich nicht auf das seltsame Verhalten sprechen kann.

+0

Dieser Code hat eine andere Bedeutung als das Original. Die Syntax, die das OP verwendet, ist für Bit-Packing. Dieser Code deklariert nur ein vollständiges int und ubyte in einer nicht standardmäßigen Weise. '_fields_' sollte verwendet werden oder Dinge wie' ctypes.sizeof' funktionieren nicht korrekt (es gibt null zurück). –

Verwandte Themen