Daten in Blöcken fester Länge aufteilen...

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
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 5. August 2005, 12:34

Ich möchte nochmal auf die Problematik in dem Thread http://www.python-forum.de/viewtopic.php?p=21705#21705 hinweisen ;) Bzw. mein Kram zur Optimierung vorstellen, denn ich denke das mein Verfahren nicht wirklich optimal gelösst ist.

Das Problem ist, das ich Daten variabler Länge in 8 Zeichen Blöcke aufteilen will:

Code: Alles auswählen

import math, re

    def mkblocks ( self, data ):
        datalen = len(data)

        # Nächste Blockgröße in der data reinpaßt
        blocklen = int( math.ceil( datalen/8.0 ) ) * 8

        # data auffüllen, damit es exakt in die Blockgröße reinpaßt
        data += "\x00" * (blocklen - datalen)

        # in Blöcke von 8 Bytes aufteilen
        return re.findall( ".{8}", data )
Ein Problem sehe ich auch mit dem Auffüllen mit NULL-Bytes, wenn in den Daten evtl. schon NULL-Bytes am Ende stehen... Aber so willt ist das für mich erstmal nicht...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
joe

Freitag 5. August 2005, 14:24

Hi!
jens hat geschrieben:

Code: Alles auswählen

        # in Blöcke von 8 Bytes aufteilen
        return re.findall( ".{8}", data )
Sind in data "binäre" daten? Dann scheitert re.findall() bei jedem '\x0A'.
Ich würd es eher so machen:

Code: Alles auswählen

    return [data[i*8:i*8+8] for i in range((len(data)-1)/8+1)]
joe
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 5. August 2005, 16:24

Du bringst mich da auf eine Idee:

Code: Alles auswählen

import math

    def mkblocks ( self, data ):
        datalen = len(data)

        # Länge gerundet auf nächst höhere Blockgröße
        blocklen = int( math.ceil( datalen/8.0 ) ) * 8

        # data auffüllen, damit es exakt in die Blockgröße reinpaßt
        data += "\x00" * ( blocklen - datalen )

        # in Blöcke von 8 Bytes aufteilen
        return [data[i:i+8] for i in range( 0, blocklen, 8 )]

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten