base_convert()
Scopri la funzione base_convert() di PHP per convertire numeri da una base numerica a un'altra, con esempi pratici e avvertenze.
La funzione base_convert() converte un numero da una base numerica a un'altra — ad esempio, dal decimale (base 10) al binario (base 2), o dall'esadecimale (base 16) al decimale. È il più versatile tra gli strumenti di conversione di base di PHP, perché funziona con qualsiasi base da 2 a 36, mentre funzioni come dechex() o bindec() sono vincolate a una singola coppia di basi.
Questa pagina illustra la sintassi, il range valido di basi, una serie di esempi eseguibili, le insidie da evitare (distinzione maiuscole/minuscole, frazioni, limiti di precisione) e quando conviene utilizzare una funzione più specifica.
Sintassi
base_convert(string $num, int $from_base, int $to_base): string| Parametro | Descrizione |
|---|---|
$num | Il numero da convertire, fornito come string (viene accettato anche un intero, che verrà convertito in string). |
$from_base | La base in cui $num è attualmente espresso. Deve essere compresa tra 2 e 36. |
$to_base | La base in cui convertire $num. Deve essere compresa tra 2 e 36. |
Valore restituito: il numero convertito come string, sempre in minuscolo. Le basi superiori a 10 utilizzano le lettere a–z per le cifre 10–35 (quindi la base 16 usa 0-9 e a-f, la base 36 usa 0-9 e a-z).
Un esempio di base
L'uso più comune è la conversione di un numero decimale in binario:
Il decimale 10 diventa la string "1010" in binario. Nota che il risultato è una string, non un intero — tienilo a mente se intendi eseguire operazioni aritmetiche su di esso in seguito.
Conversione tra basi comuni
La stessa funzione gestisce esadecimale, ottale e qualsiasi base intermedia. Ecco diverse conversioni a confronto:
<?php
echo base_convert("ff", 16, 10), "\n"; // hex -> decimal: 255
echo base_convert("255", 10, 16), "\n"; // decimal -> hex: ff
echo base_convert("777", 8, 10), "\n"; // octal -> decimal: 511
echo base_convert("a37334", 16, 2), "\n";// hex -> binary
echo base_convert("zz", 36, 10), "\n"; // base 36 -> decimal: 1295
?>Questo produce:
255
ff
511
101000110111001100110100
1295Poiché base_convert() gestisce entrambi gli estremi della conversione, non è necessario concatenare due chiamate separate per passare, ad esempio, dall'esadecimale al binario.
Cose a cui prestare attenzione
- Le lettere vengono normalizzate. Le lettere in input possono essere maiuscole o minuscole (
"FF"e"ff"funzionano entrambe), ma l'output è sempre in minuscolo. - Le frazioni non sono supportate.
base_convert()lavora solo su numeri interi. Un valore come"12.34"ha il suo.trattato come un carattere non valido — viene eliminato e vengono convertite solo le cifre (e PHP 8.1+ emette un avviso di deprecazione per i caratteri ignorati). - Le cifre non valide vengono ignorate. Un carattere non valido per
$from_base(ad esempio un9quando$from_baseè 8) viene eliminato silenziosamente anziché generare un errore, quindi è bene validare l'input in anticipo. - La precisione è limitata. Internamente il valore viene gestito come numero in virgola mobile. Gli interi molto grandi possono perdere precisione e produrre un risultato impreciso. Per la conversione di base con precisione arbitraria, utilizza l'estensione GMP con
gmp_init()specificando una base.
Quando usare una funzione più specifica
Se converti sempre da o verso la base 10, le funzioni dedicate sono più chiare e leggermente più veloci:
dechex()/hexdec()— decimale ⇄ esadecimaledecbin()/bindec()— decimale ⇄ binariodecoct()/octdec()— decimale ⇄ ottale
Usa base_convert() quando nessuna delle due basi è 10 (ad es. hex → binario) o quando la base è insolita, come la base 36 (spesso usata per ID brevi e adatti agli URL).
Conclusione
base_convert() è lo strumento generico di PHP per spostare un numero intero tra due qualsiasi sistemi numerici dalla base 2 alla base 36. Ricorda che restituisce una string in minuscolo, ignora le frazioni e le cifre non valide, ed è limitata dalla precisione in virgola mobile per valori molto grandi. Per le conversioni comuni da decimale a X, gli helper dedicati dec*() / *dec() sono di solito la scelta migliore.