Newsgroup: it.comp.lang.delphi
Titolo: Decomprimere file da formato non conosciuto (un pò lungo)

Ho un problema con un formato dati relativo ad un listino che ricevo da 
un fornitore.
Il tutto funziona cosi: Via soap mi collego al fornitore e mi scarico il 
listino in formato xml, solo che il listino ï¿œ composto da una parte in 
chiaro che ï¿œ l'intestazione e da una parte compressa "in base64".
Dopo essermi sbattuto non poco per capire come funziona la compressione 
base64 sono giunto alla conclusione che la parte dati ï¿œ stata compressa 
con un qualche algoritmo di compressione, e di seguito il file binario 
ottenuto ï¿œ stato convertito in base64 per ottenere una stringa 
stampabile su un file xml.
Ora io dovrei fare il processo inverso e sono a metï¿œ strada.
Se Dati: string ï¿œ la stringa dei dati che ottengo dall'omonimo tag del 
file xml, utilizzando le indy ed in particolare TIdDecoderMIME riesco a 
riconvertirla in formato binario cosï¿œ:
TIdDecoderMIME.DecodeString(NData.Text)
Il risultato ottenuto lo sbatto byte per byte su un file con questo metodo:
procedure SaveFile(const PathFile, Data: string);
var
   MyFile: File;
   OneByte: Byte;
   Len, I: Integer;
begin
   AssignFile(MyFile, PathFile);
   ReWrite(MyFile, 1);
   for I := 1 to Length(Data) - 1 do
   begin
     OneByte := Ord(Data[I]);
     BlockWrite(MyFile, OneByte, 1);
   end;
   CloseFile(MyFile);
end;
Il file cosï¿œ ottenuto non ï¿œ scompattabile con Cartelle compresse di 
Windows, e nemmeno da delphi con la ZLib, ho provato cosï¿œ
   PathFile := ExtractFilePath(ParamStr(0)) + 'astruso.zip';
   InFile := TFileStream.Create(PathFile, fmOpenRead);
   OutFile := TFileStream.Create(ExtractFilePath(ParamStr(0)) + 
'prova.txt', fmCreate);
   DecStream := TZDecompressionStream.Create(InFile);
   try
     OutFile.CopyFrom(DecStream, 0);
   finally
     DecStream.Free;
     OutFile.Free;
     InFile.Free;
   end;
e nemmeno dal componente ZipForge, che fa parte della mia toolbox, ma 
riesco a scompattarlo manualmente con WinRar, ottenendo dopo tanta 
fatica i dati in chiaro.
Ora devo solo capire come riprodurre la scompattazione da codice, visto 
che non ho idea di quale algoritmo di compressione hanno usato.
Ringrazio in anticipo chiunque abbia qualche suggerimento
Roberto

 Roberto
1) chiedi delucidazioni al tuo fornitore su come viene creato il file 
che fa scaricare
2) lanci una shellexecute(and wait) di winrar con parametro il file che 
crei e testi il ritorno se tutto a posto prendi in carico il file 
scompattato da winrar
^_Goblin_^
-- 
Ibis et redibis non morieris in bello
http://goblinland.myminicity.com/

 scompattato da winrar
Questa ï¿œ l'ultima spiaggia, ma aldilï¿œ del fatto che non mi piace molto 
come soluzione, dovrei verificare cliente per cliente se hanno winrar 
installato (ï¿œ una app distribuita).

 installato (è una app distribuita).
Almeno ti serve come inizio, per capire se si tratta veramente di un
file compresso o
se c'e' qualche altro problema, magari nella conversione base64.
Un'alternativa e' guardare i primi byte del file che vai a scrivere:
spesso
nei file compressi indicano il tipo di compressione usata (ad esempio
un .rar
ha come primi byte i caratteri 'rar', un .zip ha 'PK', un .7z ha '7z'
eccetera.)
ciao
G

 installato (è una app distribuita).
Se riesci a scompattarla manualmente con winrar la procedura di 
deconversione Base64 la fai giusta.
Hai provato con 7Z ?
Se funziona ... le funzioni di compressione/decompressione delle jedi 
usano un wrapper proprio sulla Dll di 7Z


 eccetera.)
Giusto. purtroppo i primi caratteri sono #$1F che corrisponde all ascii 
  31 e #$8B che corrisponde all'ascii 139.
Ma il formato deve essere valido perch� winrar riesce ad aprirlo.
Un'anomalia che ho notato � che all'interno non � riportato il nome del 
file compresso, cio� ci sono direttamente i dati.
Winrar lo scompatta dandogli in automatico il nome del file zip senza 
nessuna estensione.

 usano un wrapper proprio sulla Dll di 7Z
Provo subito. Grazie.

 estensione.
Vedo che ormai hai giï¿œ risolto, quello che mi chiedo ï¿œ perchï¿œ fare 
tutto questo lavoro quando stai operando su un file che ti viene 
fornito e tu al fornitore non chiedi nulla, anzi perdi tempo per fare 
tutte prove inutili.
Una telefonata, o email, che chieda le specifiche del file erogato da 
WS non potevi farla? :-)
Io mi sono trovato nella tua stessa situazione diverse volte, e ho 
sempre risolto in quel modo. Le informazioni, che sono la cosa piu' 
preziosa, dovresti fartele dare da chi le possiede, non ricavartele tu 
sepndendo tempo e denaro. (ovvio che il mio discorso decade se tu hai 
deliberatamente scelto di fare reverse engineering sul file per tuo 
puro interesse)
Tempo fa ho dovuto consumare un webservice alimentandolo con degli xml 
che avevano incorporati diversi file binari.
Dovetti implementare una codifica BASE 64 dei file e al produttore del 
WS ho dovuto aggiungere dei nodi nel DOM che specificassero il nome del 
file allegato, la grandezza in bytes, e altre informazioni.
Io ho dovuto dargli queste informazioni perchï¿œ lui me le ha richieste.
Cosï¿œ dovrebbe fare con te il tuo fornitore. ;-)
Ciao
-- 
Morde

 allegato, la grandezza in bytes, e altre informazioni.
Si dovrebbe rileggere come:
Dovetti implementare una codifica BASE 64 dei file e, poichï¿œ richiesto 
dal produttore del WS, ho dovuto aggiungere dei nodi nel DOM che 
specificassero il nome del file allegato, la grandezza in bytes, e 
altre informazioni.
ciao
-- 
Morde

 provato (come avevo riportato dal primo post).
Ops scusa, non lo avevo notato! :(
Allora puoi capire che file e' aprendolo con winrar e usando il menu
"tools|show information": tra le altre cose ti dice in che formato e'
stato
compresso il file.
ciao
Giacomo

 Ma il formato deve essere valido perch� winrar riesce ad aprirlo.
E' il formato gzip.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 compresso il file.
Grande idea, ed in effetti, come dice Andrea LaForgia risulta essere un 
GZip.
Adesso sto provando un p� di roba per gzip, come le Abbrevia, ma i 
risultati sono negativi

 Provo subito. Grazie.
Sto provando con 7zip, sia dal programma di utilizzo che dalle librerie 
jedi, e il programma lo scompatta anche se mi segnala un errore, mentre 
usando le librerie da delphi proprio non ne vogliono sapere.
Ma forse sono io che sbaglio qualcosa.
E' il caso che stacchi un momento.
Grazie dei consigli

 non potevi farla? :-)
L'email l'ho mandata, mentre la telefonata la faccio subito.
Ovviamente in linea di principio hai ragione tu, il problema ï¿œ che da 
una parte ho i fornitori che sono grosse aziende e le persone con cui 
tratto telefonicamente sono per lo piï¿œ (ma non sempre) utenti esperti e 
non programmatori, se hai problemi con l'account te lo risolvono, ma se 
gli chiedi che algoritmo di compressione usano potrebbero non sapere di 
cosa parli.
Dall'altra parte ci sono i clienti per i quali tu (cioï¿œ io) sei 
perfettamente sostituibile con qualche altra software house che vende il 
tuo prodotto (e ce ne sono diverse).
Comunque ripeto che hai ragione tu. Meglio qualche telefonata in piï¿œ 
anche a costo di rompere che sbattere la testa a destra e sinistra 
inutilmente.

 risultati sono negativi
http://gnuwin32.sourceforge.net/packages/gzip.htm
Invocalo esternamente mediante ShellExecute.


Alla fine sono riuscito ad aprire questo file usando proprio le Jedi e 
la dll 7z.dll.
Un pï¿œ scomodo perchï¿œ dovrï¿œ passare la dll a tutti i clienti, ma funziona.
Grazie a tutti


Hai provato i componenti "abrevia" di Turbopower ???
^_Goblin_^

 ^_Goblin_^
Li ho provati con Delphi 6 senza buon esito, ma va detto che avevo un 
bug in una procedura quindi dovrei riprovare.
Il problema per me con le Abrevia ï¿œ che ci sono solo fino a D7, mentre a 
me servono per un package compilato con D 2009.

 me servono per un package compilato con D 2009.
Non mi ricordo chi ha postato questo link:
http://www.songbeamer.com/delphi/
che ho preso e messo da parte per usi futuri, come questo :)


 ^_Goblin_^
Accidenti quanto ben di Dio!
Grazie di questo link prezioso, adesso proverï¿œ questa versione delle 
Abbrevia e ti faccio sapere con il prox post.
Ciao e grazie
Roberto

 
Niente da fare. anche la versione Abbrevia di questo link, quando i 
package vengono compilati, da degli errori dovuti alle stringhe unicode.
Comunque la soluzione l'ho trovata, con le Jedi e la dll 7z.dll