Newsgroup: it.comp.lang.perl
Titolo: cosa sono pack e unpack??

Salve,
    mi presento: sono un perfetto ignorante di PERL, pensate che ho scoperto
ora che e' un linguaggio orientato alla gestione dei file... :) Io sto
cercando una routine che da un file MP3 mi estragga info come la durata, il
bitrate ecc. e per ora l'ho trovata solo sul CPAN (MPEG::MP3Info), ma è
scritta in PERL... Dopo lunghe fatiche (sono un progammatore VC++, Pascal e
VB) sono riuscito a capire la filosofia, ma c'è ancora una riga per me
completamente misteriosa:
    $bytes = unpack('l', pack('L', unpack('N', $byte)));
il bello è che tutti i dati sono in qualche maniera "criptati", ma come???
Che istruzioni sono "pack" e "unpack"??
non includo tutto il .pm perchè è lunghetto, se volete potete scaricare
tutto da: (sono 45k)
http://cpan.valueclick.com/modules/by-category/18_Images_Pixmaps_Bitmaps/MPE
G/MPEG-MP3Info-0.63.tar.gz
(la riga che ho citato è nella sub _get_head)
Ringrazio anticipatamente tutti per l'aiuto... se potete rispondetemi via
mail a 
p...@iol.it
 !! E grazie ancora!!
Luca Burelli 
p...@iol.it

 Che istruzioni sono "pack" e "unpack"??
pack() ed unpack() sono routines che aiutano a fare l'unica cosa difficile
per il perl, ovvero il trattamento di dati binari.
pack() prende un array come argomento e genera una variabile che contiene
la rappresentazione binaria della sequenza di valori dell'array, secondo
una particolare specifica di formato.
unpack() fa il viceversa: prende una variabile e crea un array i cui
elementi sono blocchi di bits della variabile estratti secondo la
specifica di formato. 
Quindi:
unpack('N', $byte)  genera un array i cui elementi sono i bits di $byte
                    'N' indica che i bits sono in ordine "big-endian". Dal
                    contesto deduco che $byte ha valori tali che il
                    risultato e' un array di un solo elemento.
pack('L', x)        prende l'unico valore della precedente e ritorna uno 
                    scalare contenente un 'unsigned long (32 bits)' 
unpack('l', x)      trasforma lo scalare riportato dalla precedente in un
                    array (di un unico elemento) il cui valore numerico e'
                    l'interpretazione come longword (32 bit con segno).
In breve direi che l'operazione serve a generare un numero intero
manipolabile con l'aritmetica normale a partire da una sequenza di 4 bytes 
in formato "big-endian". La ragione dovrebbe essere quella di rendere il
programma indipendente dalla particolare rappresnetazione (big-endian o
little-endian) della CPU su cui gira.
In C o C++ la stessa cosa si farebbe mediante una "union" fra un "long" ed
un array di 4 bytes, per swappare i bytes se la macchina su cui gira il
programma e' little-endian (se e' big-endian, non c'e' bisogno).
Spero di essere stato utile.
						l.f.
--------------------------------------------------------------------------
       -- )     Luca Fini                            Tel: +39 055 2752 307
 ___    |\      Osservatorio Astrofisico di Arcetri  Fax: +39 055 2752 292
/   |   | |-_   L.go E.Fermi, 5 +-----------------------------------------
(___|___//___)  50125 Firenze  /   WWW: 
http://www.arcetri.astro.it/~lfini
 (_)      (_)   Italia        / e-mail: 
lf...@arcetri.astro.it
-----------------------------+--------------------------------------------
                              In a world without fences - who needs GATES?

 scritta in PERL... Dopo lunghe fatiche (sono un progammatore VC++, Pascal e


    Avrei dovuto intuirlo che era cosě facile... in 2 parole quella riga era
perfettamente inutile e voleva dire "prendi i primi 4 byte del file
nell'ordine in cui sono": dopo ci sono una barca di >> e & per isolare i bit
corrispondenti ai vari dati dell'header.
    Dopo la vostra spiegazione, il difficile č stato spiegare al C++ come
allineare i campi a bit di uno struct in maniera che corrispondessero, ma ce
l'ho fatta!
Grazie a tutti!!
PS. Stupenda firma Luca Fini -- specie l'ultima riga:
