struct.pack - Wertebereich der Variablen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Poseidonius
User
Beiträge: 63
Registriert: Montag 23. Januar 2006, 08:58

Hi,

ich möchte verschieden aufgebaute Variablen mit struct.pack() als Binärdaten "zusammenpacken". Dabei kenne ich die jeweiligen Datentypen die für die einzelnen Werte benutzt werden sollen. Wie zum Fuchs kann ich den Wertebereich eines Datentypes (angeben als C Datentyp oder im Python struct Buchstabenkürzel) herausbekommen, um zu prüfen, ob dieser überhaupt zu einem Wert passt.

Beispiel: 'B' = unsigned char = 0 - 255 -> Ausgabe an den User, dass er einen anderen Datentyp vorgeben muss.

Natürlich könnte ich alle Wertebereiche der Datentypen hinterlegen, aber das ist so unsexy. Hat jemand eine bessere Idee?

Code: Alles auswählen

def datatype_ok(value, datatype):
      if ?:
            return 1
            print ('Datentyp ok')
      else:
            return 0
            print ('Value ausserhalb des Zahlenbereiches von %s')%datatype

print (310, 'unsigned char')
print (310, 'B')
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Soll das plattformunabhängig funktionieren? Du kannst mit struct auf die nativen Typen zugreifen, dann funktioniert aber ein 64bit-long nicht mehr auf einem 32bit System (Linux). Was immer geht, ist auf die Bytegrösse runterzugehen und schauen, ob der Wert, den Du in Python hast, da noch reinpasst. Bei signed ist es halt ein Bit weniger als 2^(8*Bytes)-1.
So richtig verstehe ich Dein Problem aber nicht.

Vllt. hilft Dir struct.calcsize() weiter:

Code: Alles auswählen

# Groesse eines long in Byte
struct.calcsize('l') # liefert z.B. 4: 2**32-1 fuer unsigned bzw. 2**31-1 fuer signed
Poseidonius
User
Beiträge: 63
Registriert: Montag 23. Januar 2006, 08:58

struct.calcsize() ... da hätte man auch drauf kommen können, wenn man sich die Doku einfach ein Stückchen weiter durchgelesen hätte ! Genau das was ich gesucht habe.

Tausend Dank und ein schönes Wochenende für jerch

Poseidonius
Antworten