2016-10-25 7 views
1

Ich muss dynamisch eine ctypes Strukturfeld Größe ändern:Ändern der Größe eines ctypes Struktur

from ctypes import * 

class a(Structure): 
    _fields_ = [('first', c_ubyte*10), ('second', c_ubyte*20)] 

Lassen Sie uns jetzt sagen, ich brauche ‚zweiten‘ 100 Bytes anstatt zu sein von 20. Ich habe versucht, die folgenden:

class b(a): 
    _fields_ = [('second', c_ubyte*100)] 

dem zu arbeiten scheint:

b.second 
<Field type=c_ubyte_Array_100, ofs=30, size=100> 

Das Problem ist, dass alle er hinzugefügt, um die 100-Element-Array an das Ende b getan hat:

sizeof(b) #want this to be 110 
130 

c = b() 
addressof(c.second) - addressof(c) #want this to be 10 
30 

Wie kann ich die ‚zweite‘ Mitglied b verlängern, ohne es als eine Klasse in keinem Zusammenhang mit einem völlig neu zu definieren.

Auch Lösungen wie Resize funktionieren nicht:

c = a() 
resize(c.second, 100) 
ValueError: Memory cannot be resized because this object doesn't own it 

Antwort

0

Es nicht gerade eine einfache Möglichkeit, dies zu tun, wie ctypes Strukturen sind aus eher statisch sein (ihre c-Pendants entsprechen). Anyways, könnten Sie ctypes.Structure Unterklasse und auf dieser Klasse so etwas wie dies als eine Funktion tun:

def getUpdated(self, fieldName, fieldType): 
    fieldsCopy = self._fields_ 
    found = False 
    for idx, itm in enumerate(fieldsCopy): 
     # find a matching field name 

     i = list(itm) # can't modify a tuple 
     if i[0] == fieldName: 
      i[1] = fieldType 
      fieldsCopy[idx] = tuple(i) # update the type with the new one 
      found = True 
      break # end the loop 

    if not found: # fieldName wasn't in the field 
     return False 

    class TmpStructure(Structure): 
     ''' we made a new structure type based off the original ''' 
     _pack_ = self._pack_ 
     _fields_ = fieldsCopy 

    return TmpStructure # return the type, though we could probably 
         # pass the values if needed and make a new instance 
         # of the new 

`

Grundsätzlich werden wir einen neuen Typ mit einem geänderten Feldtyp zurück. Dies könnte modifiziert werden, um auch Bitfelder, Structure Vererbung und/oder Rückgabe von Instanzen anstelle von Typen zu behandeln. Obwohl dies genug sein sollte, um Sie zu beginnen.

Verwandte Themen