Как перевести Base64 в Base58
- Вставьте строку Base64 в поле Ввод · Base64. Подходят и стандартные, и URL-safe символы, а также отсутствующее дополнение
=, переносы строк и префиксdata:. - Результат появится в поле Результат · Base58.
- Для алфавита, отличного от алфавита Bitcoin, выберите его в поле Алфавит под результатом. Flickr и Ripple используют те же 58 символов в другом порядке.
- Нажмите Скопировать результат или кнопку Base58 → Base64 в переключателе направления, чтобы вернуться обратно. Страница Base58 в Base64 сразу открывается в этом направлении.
Преобразование идёт через сырые байты: Base64 декодируется, и байты кодируются в Base58. Ничего не добавляется и не теряется: из 32 байт ключа получаются те же 32 байта.
Примеры
| Base64 | Base58 | Что это |
|---|---|---|
SGVsbG8= | 9Ajdvzr | Текст Hello |
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= | 11111111111111111111111111111111 | 32 нулевых байта: System Program в Solana |
Bt324ddloZPZy+FGzut5rBy0he1fWzeROoz1hX7/AKk= | TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA | ID программы SPL Token в Solana |
Bt324ddloZPZy-FGzut5rBy0he1fWzeROoz1hX7_AKk | TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA | Тот же ключ в URL-safe Base64 без дополнения |
По двум последним строкам видно, что формат ввода не важен: в обоих случаях декодируются одни и те же 32 байта.
Как собрать CIDv0 для IPFS из дайджеста SHA-256
CIDv0 получается кодированием мультихеша в Base58: байты 12 (SHA-256) и 20 (длина 32 байта), а за ними дайджест. Многие инструменты печатают дайджест SHA-256 в Base64, и если конвертировать только его, строки Qm… не получится:
| Байты | Base64 | Base58 |
|---|---|---|
| Только дайджест | JiqGtnblhp7dXRrfj/0B1inDFUv96uz8jPoNkOCILYo= | 3Zz6yE7jDUVDb6doCEWrK58or4X2TmTLBiJeyWY4NHvq |
12 20 + дайджест | EiAmKoa2duWGnt1dGt+P/QHWKcMVS/3q7PyM+g2Q4Igtig== | QmQudp5N7EzTxrBk3yESEKyEroMYNd7R22G2KWffwNZyzq |
EiA в начале второй строки Base64 кодирует заголовок 12 20, так что мультихеш в Base64 легко узнать. Чтобы добавить заголовок самостоятельно, переведите дайджест через Base64 в hex, допишите в начало 1220 и закодируйте hex на странице Base58, выбрав в поле Из значение Hex.
Это помогает, только если у вас уже есть дайджест, который вычислил IPFS. IPFS хеширует блок UnixFS файла, а не сам файл, поэтому sha256sum от файла не даёт его CID.
Длина: Base64 и Base58
| Байты | Base64 | Base58 (случайные данные) |
|---|---|---|
| 16 | 24 | 21 или 22 |
| 20 | 28 | от 26 до 28 |
| 32 | 44 | 43 или 44 |
| 64 | 88 | 87 или 88 |
Длина Base64 зависит только от числа байтов. Длина Base58 зависит ещё и от значения, поэтому адреса Solana бывают от 32 до 44 символов. Не проверяйте Base58 по точной длине.
То же преобразование в JavaScript
Node.js декодирует Base64 встроенными средствами, а для половины с Base58 нужен 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'
Buffer.from(…, "base64") принимает и URL-safe ввод. Функция опирается на Buffer из Node; подробнее о нём рассказывает статья Base64 в Node.js.
Вопросы и ответы
Можно ли перевести Base64 в Base58, не декодируя в байты?
Посимвольно нельзя. Base64 кодирует фиксированные группы по 6 бит, а Base58 рассматривает все байты как одно число, поэтому любой конвертер сначала декодирует Base64 в байты и заново кодирует их. Так работает и эта страница.
Почему результат в Base58 иногда короче, чем Base64?
В Base58 нет дополнения, а каждый ведущий нулевой байт стоит один символ. 32 байта всегда занимают 44 символа Base64 (с =), а в Base58 43 или 44, и только 32, если все байты нулевые.
Какой алфавит Base58 использует Solana?
Алфавит Bitcoin, он здесь выбран по умолчанию. Варианты Flickr и Ripple выбираются в поле Алфавит.
Почему результат в Base58 не начинается с Qm?
Qm даёт двухбайтовый заголовок мультихеша 12 20. Если в вашем Base64 только 32-байтовый дайджест SHA-256, сначала допишите эти два байта в начало, как описано на этой странице.