Jump to content
Nokioteca Forum

[symbian,pys60] File Di Backup .arc


memoryn70
 Share

Recommended Posts

Ciao! Sapete con l' introduzione dei plugin con WinFile, Snake soprattutto ha implementato molti formati tra cui gif,mbm,ota ecc...

Io,invece, volevo scoprire il formato dei file di backup .arc (quelli che si creano con l'applicazione Memory Card): infatti più di una volta capita di voler estrarre solo alcuni file o comunque una parte dell'archivio.

Inanzitutto ho aperto il file con un hex editor e ho visto i vari percorsi. Ho immaginato che tra i percorsi ci sia il blocco del contenuto dei file (infatti poi si è rivelato cosi). Il problema che non è semplicemente una copia del file, bensi sono byte "a caso", si poteva pensare. Invece no! Ho pensato che il contenuto sia zipppato: è proprio cosi! Allora ho provato a zippare con python una lettera a vedere cosa mi da in output ("a".encode('zlib')). Mi da una stringa molto più lunga di un solo carattere e, da notare, questa stringa contiene all'inizio dei byte che identificano la compressione e sono sempre quelli. Cosi gli ho cercati nel file: esistono! Allora ho provato a estrarre quella parte di byte " a mano " e a decomprimerli: ....tata! Il file txt sono riuscito a leggerlo!

Ora però dovevo scoprire come fare a capire bene l'inizio, la fine del blocco dati, la lunghezza del percorso ecc...Con un po di pazienza e intuito ho trovato il significato di svariati byte e stringhe di byte.

Cosi ecco che ho fatto una piccola libreria...funziona! E ho adirittura provato ad estrarre tutto con successo.

Descrizione formato file

Dovrebbe andare bene per tutti i 2nd edition: se qualcuno prova su vari device sarei contento...anche su 3rd!

INIZIO

Primo byte (sempre \x00 ???)

Sucessivi 4 byte (long)-> Totale files

Dopo altri 10 byte, un byte che dichiara la lunghezza del nome del file (primo)

Alla fine del nome del file e dopo altri 10 byte, abbiamo 4 byte che indicano la dimensione scompressa e dopo altri 4 byte che indicano la dimensione compressa. La dimensione compressa sono i byte da leggere subito dopo e decomprimere. Alla fine del "blocco dati" si ricomincia con il byte della lunghezza del nome del file e via cosi fino alla fine, n volte dove n è il numero dei files, all'inizio.

Verso la fine del file arc (6 bytes prima) c'è una sigla che non codifica niente ma indica il modello su cui il backup si può applicare (immagino)

Su N70 è RM8405 (rm84 è il modello che si vede con *#0000#).

Ecco qui :D

P.S: a scovare questo non ci ho messo nemmeno tanto, praticamente meno di una giornata! Anche perchè in questo periodo sono spesso via...

Allego la libreria in python! Si può usare sia sul telefono che sul pc (dove ho fatto le prove)

Praticamente ha una classe arc.

esempio di uso:

import arc_file

a=arc_file.arc("E:\\Backup\\Backup.arc")

#Prima di fare tutte le operazioni bisogna fare load!

a.load() #Carica tutti i file

#Tutte azzerate se non si chiama load()

a.filelist #Lista dei files (lista unicode)

a.numfiles #Numero files

a.loaded #Interna: 1 se già chiamata load()

a.data #Dizionario: Nome File: [posizione blocco dati nel file arc (assoluta),lunghezza blocco dati, dimensione blocco dati scompressa]

a.real_size #Totale dimensione scompressa

a.filename #nome file arc

a.close() #Chiude il file

a.get(n) #Ritorna il contenuto scompresso di un file dell'archivio

''Codice get()''

s.file.seek(s.data[n][0])

return s.file.read(s.data[n][1]).decode('zlib')

a.file #file object arc

arc_file.zip

Modificato da memoryn70
Link to comment
Condividi su altri siti

...per estrarre tutto:

#TESTS
f=arc("file arc")
f.load()
print f.filelist
#print f.data
print f.numfiles
print len(f.filelist)
#print f.get(f.filelist[-2])
print f.filesize
print f.real_size
t=0
import os
#EXTRACT
for fn in f.filelist:
bytes_written=0
fn1=fn.replace(u'C:\\',u'E:\\prova\\') #root di destinazione
try: os.makedirs(os.path.split(fn1)[0])
except: pass
bw=open(fn1,'wb')
bw.write(f.get(fn))
#preso da sisboom...servirebbe a evitare di caricare tutto in memoria
# zlib_class = zlib.decompressobj()
# f.file.seek(f.data[fn][0])
# while bytes_written < f.data[fn][2]:
	# temp_bytes = f.file.read(10000) #valore da verificare
	# bytes_written += len(temp_bytes)
	# temp_bytes = zlib_class.decompress(temp_bytes) #Decomprimi l'oggetto
	# bw.write(temp_bytes)
bw.close()

Link to comment
Condividi su altri siti

Posto il plugin che ho fatto per WinFile (va bene dalla versione 1.03, cmq installate sempre l'ultima :))

Arc Plugin for WinFile v 0.2

Features:

-Esplora e apre i file di backup dei telefoni Symbian (2nd edition tutti??)

-Visualizza dettagli: dimensione, dimensione scompressa, file totali e modello con il quale il backup si è creato

-Permette l'estrazione dei file (non l'apertura diretta, altrimenti sarebbe buggosa fino a che non implemento un supporto migliore)

-L'estrazione dei file può essere: singola; selezionati; cartelle; totale

-Mentre estrae viene visualizzata una barra di avanzamento che in tutti i casi si basa sulla dimensione da estrarre,per avere l'idea corretta di quanto manca o se si è bloccato qualcosa.

-Possibilità di annullare l'estrazione (cancellando l'ultimo file estratto parzialmente)

Queste funzioni di estrazione sono venute bene e le implementerò anche nel plugin degli archivi zip.

P.S: se non vi serve il codice sul cellulare, installatevi il file arc.pyc in Plugins\fileopen: sarà più veloce ad aprirsi e consuma meno ram. Infatti nella prossima versione di wf tutti i pllugin saranno compilati (i source li metto in uno zip nella cartella plugins)

arc.zip

Link to comment
Condividi su altri siti

  • 1 mese dopo...
  • 6 mesi dopo...
  • 1 anno dopo...

Please sign in to comment

You will be able to leave a comment after signing in



Accedi Ora
 Share

×
×
  • Crea Nuovo...

Informazione Importante

Questo sito utilizza i cookie per analisi, contenuti personalizzati e pubblicità. Continuando la navigazione, accetti l'utilizzo dei cookie da parte nostra | Privacy Policy