Como converter Base64 para Base58
- Cole a string Base64 em Entrada · Base64. Caracteres padrão e URL-safe funcionam, assim como preenchimento
=ausente, quebras de linha e um prefixodata:. - Leia o resultado em Saída · Base58.
- Escolha o Alfabeto abaixo da saída se o destino não for o Base58 no estilo Bitcoin. Flickr e Ripple ordenam os mesmos 58 caracteres de outro jeito.
- Use Copiar saída, ou clique em Base58 → Base64 no seletor de direção para voltar. A página Base58 para Base64 já começa nesse sentido.
A conversão passa pelos bytes brutos: o Base64 é decodificado, e os bytes são codificados em Base58. Nada é acrescentado nem removido, então uma chave de 32 bytes continua sendo uma chave de 32 bytes.
Exemplos
| Base64 | Base58 | O que é |
|---|---|---|
SGVsbG8= | 9Ajdvzr | O texto Hello |
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= | 11111111111111111111111111111111 | 32 bytes zero: o System Program da Solana |
Bt324ddloZPZy+FGzut5rBy0he1fWzeROoz1hX7/AKk= | TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA | ID do programa SPL Token da Solana |
Bt324ddloZPZy-FGzut5rBy0he1fWzeROoz1hX7_AKk | TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA | A mesma chave em Base64 URL-safe sem preenchimento |
As duas últimas linhas são os mesmos 32 bytes escritos de duas formas em Base64, então ambas dão o mesmo Base58.
Montando um CIDv0 do IPFS a partir de um digest SHA-256
Um CIDv0 é o Base58 de um multihash: os bytes 12 (SHA-256) e 20 (32 bytes de comprimento), seguidos do digest. Muitas ferramentas imprimem um digest SHA-256 em Base64, e converter só ele não dá uma string Qm…:
| Bytes | Base64 | Base58 |
|---|---|---|
| Só o digest | JiqGtnblhp7dXRrfj/0B1inDFUv96uz8jPoNkOCILYo= | 3Zz6yE7jDUVDb6doCEWrK58or4X2TmTLBiJeyWY4NHvq |
12 20 + digest | EiAmKoa2duWGnt1dGt+P/QHWKcMVS/3q7PyM+g2Q4Igtig== | QmQudp5N7EzTxrBk3yESEKyEroMYNd7R22G2KWffwNZyzq |
O EiA no início da segunda string Base64 é o cabeçalho 12 20 codificado, então um multihash em Base64 é fácil de reconhecer. Para acrescentar o cabeçalho você mesmo, converta o digest com Base64 para hex, coloque 1220 na frente e codifique o hex na página de Base58 com De definido como Hex.
Isso só ajuda quando você já tem o digest que o IPFS calculou. O IPFS faz o hash do bloco UnixFS de um arquivo, não do arquivo bruto, então rodar sha256sum num arquivo não reproduz o CID dele.
Comprimento: Base64 vs Base58
| Bytes | Base64 | Base58 (dados aleatórios) |
|---|---|---|
| 16 | 24 | 21 ou 22 |
| 20 | 28 | 26 a 28 |
| 32 | 44 | 43 ou 44 |
| 64 | 88 | 87 ou 88 |
O comprimento do Base64 depende só da quantidade de bytes. O do Base58 depende também do valor, e é por isso que os endereços Solana variam entre 32 e 44 caracteres. Não valide Base58 pelo comprimento exato.
A mesma conversão em JavaScript
O Node.js decodifica Base64 nativamente; a metade do Base58 precisa de um BigInt:
const ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
function base64ToBase58(b64) {
const bytes = Buffer.from(b64, "base64");
let n = BigInt("0x" + (bytes.toString("hex") || "0"));
let out = "";
while (n > 0n) {
out = ALPHABET[Number(n % 58n)] + out;
n /= 58n;
}
for (const b of bytes) {
if (b !== 0) break;
out = "1" + out;
}
return out;
}
base64ToBase58("Bt324ddloZPZy+FGzut5rBy0he1fWzeROoz1hX7/AKk=");
// 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'
O Buffer.from(…, "base64") também aceita entrada URL-safe. A função depende do Buffer do Node; Base64 em Node.js trata disso em mais detalhes.
Perguntas frequentes
Dá para converter Base64 em Base58 sem decodificar para bytes?
Não caractere por caractere. O Base64 mapeia grupos fixos de 6 bits, enquanto o Base58 trata todos os bytes como um único número, então todo conversor, inclusive esta página, decodifica o Base64 para bytes antes e recodifica esses bytes.
Por que o resultado em Base58 às vezes é mais curto que o Base64?
O Base58 não tem preenchimento, e cada byte zero à esquerda custa um caractere. 32 bytes sempre dão 44 caracteres Base64 (com =), mas 43 ou 44 em Base58, e só 32 quando todos os bytes são zero.
Qual alfabeto Base58 a Solana usa?
O alfabeto do Bitcoin, que é o padrão aqui. Flickr e Ripple estão em Alfabeto, se você precisar.
Por que minha saída em Base58 não começa com Qm?
O Qm vem do cabeçalho multihash de 2 bytes 12 20. Se o seu Base64 contém só o digest SHA-256 de 32 bytes, acrescente esses dois bytes antes, como descrito nesta página.