2017-04-07 2 views
0

Mit dem nächsten Code:Ich verstehe nicht struct.unpack

shmem = mmap.mmap(0, 20, "MumbleLink", mmap.ACCESS_READ) 
print("size: "+str(struct.calcsize("IL3f3f3f512s3f"))) 
print(struct.unpack("IL3f3f3f512s3f", shmem)) 

ich diese Ausgabe:

size: 568 
Traceback (most recent call last): 
    File "C:\Users\Saelyth\Desktop\test.py", line 8, in <module> 
    print(struct.unpack("IL3f3f3f512s3f", shmem)) 
struct.error: unpack requires a bytes object of length 568 

Warum tut es mir sagt, dass es ein Objekt mit einer Länge von 568 erfordert, wenn calcsize sagt, es ist schon 568?

auch wert zu erwähnen, dass ich gewesen war googeln (und geprüft This) auf eine Antwort von dem, was ist IL3f3f3f512s3f oder wie können Sie Ihre eigene Zeichenfolge lesen Speicher von 1024 zum Beispiel erstellen, nicht 568, aber so Bis jetzt hatte ich kein Glück. Eine detaillierte Antwort, wie dieser Teil von struct funktioniert, würde mir helfen oder mir in die richtige Richtung zeigen, wie ich die Zeichenfolge berechnen kann, die ich zum Entpacken von shmem brauche.

Dies steht im Zusammenhang mit This Frage.

+0

Welche Version von Python? Py2 behandelt mmaps als Strings, Py3 als Bytearrays –

Antwort

1

Sie überprüfen nur die Größe in der Ausgabe, diese Größe ist nicht für Ihre Speicherkarte verfügbar. So ändern Sie Ihre erste Zeile:

shmem = mmap.mmap(0, 568, "MumbleLink", mmap.ACCESS_READ); 

, die die Größe der Struktur übereinstimmt. Wenn Sie möchten, können Sie zuerst die Größe ermitteln und dann die Speicherzuordnung erstellen, um sie abzugleichen (zweiter Parameter).

+0

Sie haben recht, ich lief im Kreis und fragte mich, was mit struct falsch war und ich habe den mmap-Teil vergessen. Vielen Dank. – Saelyth