Python, wie man 32-bit-Ganzzahl in byte-array
Ich normalerweise Dinge wie diese in C++, aber ich bin mit python zu schreiben, eine schnelle Skript und ich habe in eine Wand laufen.
Wenn ich eine binäre Liste (oder was auch immer python speichert das Ergebnis von "fread"). Kann ich den Zugriff auf die einzelnen bytes mit: buffer[0], Puffer[1], etc.
Muss ich ändern das Byte [8-11] zu halten, eine neue 32-bit-Datei-Größe (gelesen: es gibt bereits eine Datei gibt, die ich brauche, um ihn zu aktualisieren). In C++ würde ich einfach einen Zeiger auf den Ort und werfe es vor die Speicherung der integer, aber mit python habe ich plötzlich merkte, ich habe keine Ahnung, wie zu tun etwas wie dieses.
Wie kann ich das update 4 bytes in mein Puffer an einem bestimmten Ort zu halten, den Wert einer Ganzzahl in python?
BEARBEITEN
Werde ich weitere hinzufügen, weil ich kann nicht scheinen, um es herauszufinden, aus den Lösungen (obwohl ich kann sehen, dass Sie auf der richtigen Spur sind).
Zuerst von alle, bin ich auf python 2.4 (und kann nicht aktualisieren, großen Unternehmens-Servern) - so dass offenbar die Grenzen meiner Möglichkeiten. Sorry für nicht zu erwähnen, dass früher, ich war nicht bewusst, es hatte so viele weniger Funktionen.
Zweitens, wir machen diese ultra-einfach.
Können sagen, ich habe eine Binär Datei mit dem Namen 'MeineDatei.binary' mit dem fünf-byte Inhalt '4C53535353' in hex - dies entspricht der ascii-Repräsentation für den Buchstaben "L" und 4xS" allein in die Datei.
Wenn ich das Tue:
f = open('myfile.binary', 'rb')
contents = f.read(5)
Inhalt sollte (von Sven Marnach Antwort) halten Sie eine fünf-byte-unveränderliche Zeichenfolge.
Mit Python 2.4 Einrichtungen nur, wie konnte ich wechseln, die 4 S statt, die in 'Inhalt' zu einem beliebigen integer-Wert? I. e. geben Sie mir eine code-Zeile, dass kann byte-Indizes Inhalt [1-4] enthalten die 32-bit-integer 'myint' mit Wert 12345678910.
Danke, ich bin froh, erstellen Sie einen neuen string oder byte-array, wenn das der Fall ist. Wie könnte ich eine veränderbare byte-array mit der gleichen contnets, und aktualisieren Sie die Palette [1-4], die gleich der binären Darstellung meiner ganze Zahl?
Erweiterte ich mein posting unten und enthalten ein Beispiel für Python 2.4 🙂
InformationsquelleAutor John Humphreys - w00te | 2011-10-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was Sie brauchen, ist diese Funktion:
Es ist dokumentiert bei http://docs.python.org/library/struct.html in der Nähe der Spitze.
Beispiel-code:
Ähnlichen posting: Python: How to pack verschiedene Arten von Daten in einen string-Puffer mit struct.pack_into
EDIT: Hinzugefügt Python 2.4 kompatibel Beispiel:
bytearray
zu erstellen, die veränderlich-Puffer anstelle vonctypes.create_string_buffer
.Für alle ich habe versucht, arbeiten Sie es heraus und Lesen Sie die pack-Seite und die Lösungen zur Verfügung gestellt. Ich scheine sehr fehlen, da ich python 2.4 statt 2.5. Habe ich eine stark vereinfachte version meines Problems in ein edit zu meinem post oben, wenn Sie beantworten können, die mit einer Zeile code, ich werde ganz glücklich 🙂
Ich fürchte, Ihre 2.4 kompatible version nicht verwenden können
bytearray
als es eingeführt wurde, in 2.6.Hmmm. Das ist wahr, ich kann nur vermieden, die pack_into Funktion ... peinlich. Mal sehen, was da in 2.4 🙂
Ok, ich denke jetzt funktioniert es, habe versucht, es auf einer VM mit Python 2.4. Andere Einwände?
InformationsquelleAutor hochl
Haben Sie einen Blick auf Struct Modul. Sie müssen
pack
Funktion.EDIT:
Code:
Ausgabe:
struct.pack
sollte in Python2.4.Ihre Nummer "12345678910" kann nicht gepackt werden in 4 bytes, die ich verkürzt es ein wenig.
aktualisiert die Antwort
InformationsquelleAutor Andriy Tylychko
Ergebnis
file.read()
ist ein string in Python, und es ist unveränderlich. Je nach Kontext der Aufgabe, die Sie versuchen zu erreichen, gibt es verschiedene Lösungen für das problem.Die
array
- Modul: Lesen Sie die Datei direkt als array von 32-bit-Ganzzahlen. Sie können ändern, dieses array und Schreibe es zurück in die Datei.InformationsquelleAutor Sven Marnach
Können Sie installieren die numpy-Modul, das oft verwendet wird, für das scientific computing.
read_data = numpy.fromfile(Datei=id, dtype=numpy.uint32)
Dann Zugriff auf die Daten an der gewünschten Stelle und nehmen Sie Ihre änderungen vor.
InformationsquelleAutor lynvie
Folgende ist nur ein Beispiel für Sie zu verstehen, was wirklich passiert, wenn man die vier bytes werden umgewandelt in integer.
Angenommen, Sie haben eine Nummer: 15213
Auf little-endian Systemen (ich.e-x86-Maschinen), diese Zahl kann dargestellt werden mit einem Länge-4 bytearray als:
b"\x6d\x3b\x00\x00"
oderb"m;\x00\x00"
wenn Sie drucken auf dem Bildschirm, konvertieren Sie die vier bytes in ein integer ist, haben wir einfach ein bisschen Basis-Konvertierung, die in diesem Fall, ist:Dies gibt Ihnen das Ergebnis: 15213
InformationsquelleAutor Victor Yan