Come sempre con il Perl, c'è più di un modo di fare le cose.
Più sotto ci sono alcuni esempi di approcci per effettuare delle
comuni conversioni tra rappresentazioni numeriche. Tutto ciò
è da intendersi a titolo esemplificativo piuttosto che esaustivo.
Alcuni degli esempi qui sotto usano il modulo Bit::Vector da CPAN. La ragione
per cui potreste scegliere Bit::Vector rispetto alle funzioni incorporate
in perl è che lavora con numeri di OGNI dimensione, che è
ottimizzato per la velocità su certe operazioni e che, almeno per qualche
programmatore, la notazione usata potrebbe essere familiare.
- Come si convertono esadecimali in decimali
Usando la conversione incorporata in perl della notazione 0x:
$dec = 0xDEADBEEF;
Usando la funzione hex:
$dec = hex("DEADBEEF");
Usando pack:
$dec = unpack("N", pack("H8", substr("0" x 8 . "DEADBEEF", -8)));
Usando il modulo Bit::Vector da CPAN:
use Bit::Vector;
$vec = Bit::Vector->new_Hex(32, "DEADBEEF");
$dec = $vec->to_Dec();
- Come si converte da decimale ad esadecimale
Usando sprintf:
$esa = sprintf("%X", 3735928559); # maiuscole A-F
$esa = sprintf("%x", 3735928559); # minuscole a-f
Usando unpack:
$esa = unpack("H*", pack("N", 3735928559));
Usando Bit::Vector:
use Bit::Vector;
$vet = Bit::Vector->new_Dec(32, -559038737);
$esa = $vet->to_Hex();
Bit::Vector supporta conteggi di bit arbitrari:
use Bit::Vector;
$vet = Bit::Vector->new_Dec(33, 3735928559);
$vet->Resize(32); # elimina gli 0 iniziali se non sono voluti
$esa = $vet->to_Hex();
- Come si converte da ottale a decimale
Usando la conversione incorporata in perl di numeri con 0 iniziali:
$dec = 033653337357; # notate lo 0 iniziale!
Usando la funzione oct:
$dec = oct("33653337357");
Usando Bit::Vector:
use Bit::Vector;
$vet = Bit::Vector->new(32);
$vet->Chunk_List_Store(3, split(//, reverse "33653337357"));
$dec = $vec->to_Dec();
- Come si converte da decimale ad ottale
Usando sprintf:
$ott = sprintf("%o", 3735928559);
Usando Bit::Vector:
use Bit::Vector;
$vet = Bit::Vector->new_Dec(32, -559038737);
$ott = reverse join('', $vet->Chunk_List_Read(3));
- Come si converte da binario a decimale
Il Perl 5.6 permette di scrivere numeri binari direttamente con la notazione
0b:
$numero = 0b10110110;
Usando oct:
my $input = "10110110";
$decimale = oct( "0b$input" );
Usando pack e ord:
$decimale = ord(pack('B8', '10110110'));
Usando pack e unpack per stringhe di grandi dimensioni:
$int = unpack("N", pack("B32",
substr("0" x 32 . "11110101011011011111011101111", -32)));
$dec = sprintf("%d", $int);
# substr() e` usata per allungare la stringa con degli zeri
# a sinistra per portarla a 32 caratteri
Usando Bit::Vector:
$vet = Bit::Vector->new_Bin(32, "11011110101011011011111011101111");
$dec = $vet->to_Dec();
- Come si converte da decimale a binario
Usando sprintf (perl 5.6+):
$bin = sprintf("%b", 3735928559);
Usando unpack:
$bin = unpack("B*", pack("N", 3735928559));
Usando Bit::Vector:
use Bit::Vector;
$vet = Bit::Vector->new_Dec(32, -559038737);
$bin = $vet->to_Bin();
Le rimanenti trasformazioni (ad es. esa -> ott, bin -> esa, ecc.) sono
lasciate come esercizio al lettore volenteroso.