PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : größeren Integer in Binary packen


Marscel
2007-12-28, 14:27:29
Ich habe einen Integer-Wert, der einen Zeitstempel mit 10 Ziffern repräsentiert, sei es 1198847717.

Dieser Wert kostet 31 bit und soll jetzt in eine Datei abgespeichert werden, bei der es etwas auf Platzbedarf ankommt, '1198847717' (als String) reinzuschreiben kommt überhaupt nicht infrage, kostet viel Platz.

1198847717 = 0x4774F6E5

Ich hatte nun die Idee, die Hex-Darstellung binary in die Datei zu schreiben, da gehen 4 Byte für drauf, heißt '\x47\x74\xF6\xE5'.

Jetzt hab ich diese Perl-like Funktionen pack() und unpack() gefunden, die anscheinend genau das tun können.

So recht komme ich damit aber noch nicht klar, welches Format angeben, welchen Wert?

- pack('H*', 1198847717) packt jedenfalls nicht das gewünschte Ergebnis,
- pack('H*', '4774F6E5') macht schon das richtige, allerdings gehts doch sicher eleganter, dass man nicht erst die Hex-Repräsentation in einen String umwandeln muss, oder?

Sprache ist PHP oder Python (mit Präferenz bei letzterem), aber das sollte nichts zur Sache tun hier. Ich find die Lösung nicht, habe schon herumprobiert, aber so recht wills nicht.

Trap
2007-12-28, 16:08:35
Hast du mal in die Dokumentation geguckt, die zu pack/unpack ist da:
http://docs.python.org/lib/module-struct.html

pack('i', 1198847717) sollte das gewünschte machen...

Binary Sachen in eine Textdatei zu schreiben ist aber keine allzu gute Idee.

Marscel
2007-12-28, 16:13:20
Hast du mal in die Dokumentation geguckt, die zu pack/unpack ist da:
http://docs.python.org/lib/module-struct.html

Sicher, soweit aber trotzdem nicht geholfen.

pack('i', 1198847717) sollte das gewünschte machen...

Das Ergebnis ist '\xE5\xF6tG', soweit war ich auch schon, ist aber nicht das gewünschte, zumal ich nicht weiß, was 'tG' da zu suchen hat. BE, LE-Flags...?

Binary Sachen in eine Textdatei zu schreiben ist aber keine allzu gute Idee.

Es wird keine Textdatei, sondern eine Binary.

Trap
2007-12-28, 16:23:41
t ist \x74 und G \x47 zumindest in ASCII

Kommt doch genau das raus was du haben willst :biggrin:

Coda
2007-12-28, 16:33:44
Es wird keine Textdatei, sondern eine Binary.
Und wieso speicherst du dann nicht einfach die Bits? :|

Marscel
2007-12-28, 16:39:30
t ist \x74 und G \x47 zumindest in ASCII

Phck, ja stimmt. Hatte im Zuge dessen eine komplett maskierte Ausgabe erwartet. Autsch. *g*

Und wieso speicherst du dann nicht einfach die Bits? :|

Ich bediene mich bei Python file.write(), die nimmt einen String entgegen. Abgesehen vom Packen, wie kriege ich denn die Bits "direkt" reingeschrieben?

Coda
2007-12-28, 17:04:26
Schau mal hier (http://mail.python.org/pipermail/python-list/2001-September/105529.html)

Marscel
2007-12-28, 19:09:11
Schau mal hier (http://mail.python.org/pipermail/python-list/2001-September/105529.html)

Okay. Hatte schon so eine Vorstellung. Bei 4 Bytes erstmal nicht so wichtig, aber danke für den Hinweis.