Alternativer til bruk pack_into () når manipulere en liste over bytes?

stemmer
2

Jeg leser i en binærfil i en liste og analyse av binære data. Jeg bruker pakk () for å hente ut visse deler av dataene som primitive datatyper, og jeg ønsker å redigere dataene og sette den tilbake i den opprinnelige listen over bytes. Bruke pack_into () ville gjøre det enkelt, bortsett fra at jeg bruker Python 2.4, og pack_into () ikke ble innført før 2,5

Er det noen som vet om en god måte å gå om seriefunksjon data på denne måten, slik at jeg kan oppnå i hovedsak samme funksjonalitet som pack_into ()?

Publisert på 15/07/2009 klokken 18:18
kilden bruker
På andre språk...                            


2 svar

stemmer
3

Har du sett på bitstringmodulen? Den er utformet for å gjøre konstruksjonen, analyse og modifisering av binære data enklere enn å bruke structog arraymoduler direkte.

Den er spesielt laget for å arbeide på bit-nivå, men vil arbeide med byte like bra. Det vil også arbeide med Python 2.4.

from bitstring import BitString
s = BitString(filename='somefile')

# replace byte range with new values
# The step of '8' signifies byte rather than bit indicies.
s[10:15:8] = '0x001122'

# Search and replace byte value with two bytes
s.replace('0xcc', '0xddee', bytealigned=True)

# Different interpretations of the data are available through properties
if s[5:7:8].int > 1000:
    s[5:7:8] = 1000

# Use the bytes property to get back to a Python string
open('newfile', 'wb').write(s.bytes)

Dataene som ligger til grunn er lagret i BitStringer bare et arrayobjekt, men med et omfattende sett med funksjoner og spesielle metoder for å gjøre det enkelt å endre og tolke.

Svarte 17/07/2009 kl. 14:15
kilden bruker

stemmer
1

Mener du redigere data i en buffer objekt? Dokumentasjon på å manipulere de i det hele tatt fra Python er direkte nokså knappe.

Hvis du bare ønsker å redigere byte i en streng, er det enkelt nok, skjønt; struct.pack_into er ny til 2,5, men struct.pack er ikke:

import struct
s = open("file").read()
ofs = 1024
fmt = "Ih"
size = struct.calcsize(fmt)

before, data, after = s[0:ofs], s[ofs:ofs+size], s[ofs+size:]
values = list(struct.unpack(fmt, data))
values[0] += 5
values[1] /= 2
data = struct.pack(fmt, *values)
s = "".join([before, data, after])
Svarte 15/07/2009 kl. 18:46
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more