Como usar o conversor Base36
- Digite um texto em Entrada · Texto. Os bytes UTF-8 dele são codificados e o resultado aparece em Saída · Base36.
- Escolha minúsculas ou MAIÚSCULAS em Caixa, abaixo da saída. As duas decodificam do mesmo jeito.
- Para converter um número, ajuste De em Inteiro (número grande) e digite o valor decimal. Volte Para a Base36 se você o tiver mudado.
- Para decodificar, clique em Base36 → Texto no seletor de direção, ou ajuste Para em Inteiro (número grande) para obter o decimal.
Base36 para decimal e de volta
O Base36 conta com 0–9 e depois a–z, então a vale 10 e z vale 35. Cada posição vale 36 vezes a posição à sua direita:
| Base36 | Decimal | Observação |
|---|---|---|
z | 35 | O maior dígito único |
10 | 36 | |
zz | 1295 | 35 × 36 + 35 |
1000 | 46656 | 36³ |
21i3v9 | 123456789 | |
2gosa7pa2gv | 9007199254740991 | Number.MAX_SAFE_INTEGER no JavaScript |
3w5e11264sgsf | 18446744073709551615 | 2^64 − 1 |
O conversor trabalha com BigInt, então valores de 64 e 128 bits saem exatos. O limite é de 64 KB de entrada, muito mais que qualquer ID.
Onde o Base36 é usado
O Base36 serve para identificadores que devem ser curtos e precisam sobreviver a sistemas que mudam a caixa das letras: URLs que alguns softwares convertem para minúsculas, sistemas de arquivos que não diferenciam maiúsculas e códigos lidos em voz alta ou digitados a partir do papel. Os IDs de posts e comentários do Reddit são um exemplo. A maioria das linguagens de programação também consegue ler números Base36 sem biblioteca.
Comparado às alternativas, o Base36 abre mão de um pouco de densidade em troca de não diferenciar maiúsculas. 16 bytes aleatórios dão 24 ou 25 caracteres Base36, 21 ou 22 em Base62 e 32 em hex. O Base62 é mais curto, mas diferencia maiúsculas, e o Base32 também não diferencia, mas fixa o alfabeto em grupos de 5 bits e acrescenta preenchimento.
Texto, bytes e zeros à esquerda
Para texto e outros bytes, o conversor lê a entrada como um único número big-endian e escreve esse número em base 36. Hello são os bytes 48 65 6c 6c 6f, o número 310939249775, e em Base36 3yud78mn. Bytes zero à esquerda sumiriam num número puro, então cada um é escrito como um dígito 0: os bytes 00 0a viram 0a.
Uma entrada Inteiro (número grande) não tem o problema dos zeros à esquerda, porque um número decimal não tem bytes zero à esquerda para perder.
Base36 em JavaScript e Python
As duas linguagens convertem números nativamente:
(255).toString(36); // '73'
parseInt("73", 36); // 255
(2n ** 64n - 1n).toString(36) // '3w5e11264sgsf'
O BigInt consegue imprimir em base 36, mas não tem parser para ela, e o parseInt perde precisão depois de 2^53. Um loop curto resolve:
function parseBase36(s) {
let n = 0n;
for (const ch of s.toLowerCase()) n = n * 36n + BigInt(parseInt(ch, 36));
return n;
}
parseBase36("3w5e11264sgsf"); // 18446744073709551615n
O int() do Python recebe uma base e funciona com qualquer tamanho: int("3w5e11264sgsf", 36) retorna 18446744073709551615. Não há função nativa para o outro sentido; um loop com divmod e o alfabeto 0123456789abcdefghijklmnopqrstuvwxyz resolve. Mais padrões nas páginas de JavaScript e Python.
Problemas comuns
- Erro num
-,_ou espaço dentro do valor. O Base36 só tem dígitos e letras. Remova os separadores, ou divida o valor neles se eles separarem vários IDs. - O texto decodificado é lixo. A string provavelmente era um ID numérico, não texto codificado. Ajuste Para em Inteiro (número grande) para vê-la como número.
- Pequenas diferenças nos últimos dígitos numa planilha ou JSON. O número passou por um double em algum lugar. Mantenha IDs grandes como strings de ponta a ponta.
Perguntas frequentes
Como converter Base36 em decimal?
Ajuste De em Base36 e Para em Inteiro (número grande), depois cole o valor Base36. zz dá 1295 e 3w5e11264sgsf dá 18446744073709551615, o maior número sem sinal de 64 bits.
O Base36 diferencia maiúsculas de minúsculas?
Não. Letras maiúsculas e minúsculas têm o mesmo valor, então ZZ e zz valem 1295. Isso faz do Base36 a codificação comum mais densa que sobrevive a mudanças de caixa.
Por que o parseInt do JavaScript dá outro número?
parseInt(s, 36) retorna um double, que só é exato até 2^53. parseInt("3w5e11264sgsf", 36) retorna 18446744073709552000, com erro de 385. Faça o parse para um BigInt, como mostrado nesta página.
Por que o Base36 de Hello não é igual a parseInt('Hello', 36)?
O codificador transforma os cinco bytes do texto num número e o escreve em base 36 (3yud78mn). Já o parseInt lê as letras H-e-l-l-o como dígitos Base36, o que dá 29234652.