Newsgroup: it.comp.lang.perl
Titolo: conversione di uno scalare con contenuto esadecimale

Ho trovato fra le F.A.Q. diversi esempi che, riporto qui sotto, copiati ed eseguiti funzionano, non riesco ad applicarlo al mio caso:
in uno scalare di tre byte (per es. $esanum = "000023"; )ho un valore esadecimale che dovrei convertire in numero decimale
Usando la conversione incorporata in perl della notazione 0x:
     $dec = 0xDEADBEEF;
Usando la funzione hex:
     $dec = hex("DEADBEEF");
qual'č la corretta sintassi che permatta di restituirmi, facendo riferimento al mio caso, in $dec il numero 35.
Ringraziando per la cortese attenzione.
Beppe
p.s. avrņ un analogo problema, convertire un numero decimale in esadecimale.
-- 
Questo articolo e` stato inviato dal sito web 
http://www.nonsolonews.it

 Ringraziando per la cortese attenzione.
E' proprio come hai detto tu (quindi non vedo il problema).
Se il numero esadecimale lo adoperi come valore letterale (numerico) nel 
codice, Perl lo converte automaticamente in decimale:
print 0x000023; # stampa 35
e quindi non devi fare assolutamente nulla.
Se invece il valore č acquisito dall'esterno (ad es. letto da un file) e 
quindi Perl lo tratta come una stringa, devi adoperare la funzione hex:
print hex '0x000023'; # stampa 35
e puoi anche omettere il prefisso "0x":
print hex '000023'; # stampa ugualmente 35
print hex '23'    ; # pure questo
Oppure puoi usare la funzione oct() (la quale perņ richiede il prefisso 
"0x"):
print oct '0x000023'; # sempre 35
Dov'era il problema?
Ciao,
Emanuele.

Emanuele.
Innanzi tutto grazie per la risposta, ma temo di aver mal formulato il quesito/problema, provo ad integrare.
Sto elaborando un file binario al termine del quale in una precisa posizione, ed in tre byte di memoria, č stato memorizzato il numero di record che compongono il file, devo generare da questo due file e la somma dei record scritti in output deve corrispondere al valore sopra citato.
Pertanto vorrei, dovrei, convertire lo scalare che ho valorizzato con - read(INPUT_FILE, $Segment, 3); - in un numero che posso confrontare con la somma dei due contatori utilizzati per sommare i record scritti in output.
Infine dovrň riporatere il valore dei contatori nei rispettivi file di output convertendoli, a loro volta, in binario occupando tre byte.
Spero di essere stato piů chiaro di prima.
Ringraziandoti nuovamente ti auguro un buon fine settimana.
Beppe  


read(INPUT_FILE, $Segment, 3);
Allora il "contenuto esadecimale" non c'entra per con tutta probabilità un
bel nulla: hai un valore binario, impaccato in qualche modo, che devi
disimpaccare. Come, dipende dalla rappresentazione usata, che è tutt'altro
che chiara (*3* byte? sicuro che non siano 2 o 4?). Le funzioni da usare,
comunque, sono unpack e pack.
Ciao.

 Ringraziandoti nuovamente ti auguro un buon fine settimana.
Grazie e buon fine settimana anche a te.
(Ci fai sapere se funziona per favore?)
Ciao,
Emanuele.

Emanuele Zeppieri ha scritto:

L’istruzione con la quale ho risolto il proble è la seguente:
my $number = unpack('L', pack 'a4', scalar reverse $segment);
Ho cercato fra la mia documentazione e quella disponibile nei siti che conosco di  ‘decodificare’ il commando, ma non ho ancora ben compreso il significato delle due funzioni pack ed unpack, ho imparato a programmare in Perl da autodidatta.
Nel fare altre prove, in questo momento ho il problema inverso, convertire un numero decimale, ad esempio 8483, in binario ho capito l’equivoco nel quale sono caduto. Provengo dalla programmazione COBOL e conversione è l’operzione implicita che viene eseguito su un numero in formato zoned (tanti byte quanti sono i numeri) in un numero definito binary, il numero 4294967295 è "contenuto" in quattro byte. Perl converte da un formato all’altro ma stampabile. Riprendendo l’esempio di poco prima devo ottenere in tre byte la stringa “  !#” che corrisponde a 002123 in esadecimale.
Spero di essere stato abbastanza chiaro.
Per completezza d’informazione, devo elaborare file prodotti dal sistema MSEM che produce record del traffico telefonico.
Grazie, ancora, per l’aiuto e la cortese disponibilità.
Buon pomeriggio.


“ !#” che corrisponde a 002123 in esadecimale.
Se sei sicuro che il numero sia <= 0xFFFFFF, e se l'ordine dev'essere
indipendente dal sistema, puoi impaccare in un long big-endian a 32 bit, e
buttare il primo byte:
     $long = substr(pack("N", 8483), -3);
Ciao.

 Grazie, ancora, per l’aiuto e la cortese disponibilità.
Di nulla, grazie a te per la risposta.
Fornire una risposta nella quale si dica perlomeno funziona/non funziona 
può essere di grande aiuto per chi dovesse trovarsi un domani a cercare 
soluzioni per lo stesso problema, visto che i messaggi dei newgroup 
vengono conservati sul web, ormai da più parti.
Ciao,
Emanuele.