Как декодировать Base58
- Вставьте строку в поле Ввод · Base58. Пробелы и переносы строк игнорируются.
- Байты появятся в поле Результат · Hex. Под результатом можно переключить Регистр, добавить Разделитель, например пробел или
:, или разбить дамп по 16 или 32 байта опцией Байтов в строке. - Если у строки не алфавит Bitcoin, поменяйте Алфавит под полем ввода на Flickr или Ripple.
- Для других представлений поменяйте меню В: Текст, если в данных была строка, Base64 – для API или конфига. Для этой конвертации есть отдельная страница Base58 в Base64.
- Нажмите Скопировать результат или Скачать, чтобы забрать hex, либо Сохранить байты, чтобы получить декодированные байты файлом.
Во что декодируются типичные строки Base58
| Base58 | Байты (hex) | Что это |
|---|---|---|
11111111111111111111111111111111 | 32 × 00 | Solana System Program (32-байтный ключ из нулей) |
TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA | 06ddf6e1d765…7eff00a9 (32 байта) | ID программы Solana SPL Token |
1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa | 00 62e907b1…ebb88f18 c29b7d93 | Адрес генезис-блока Bitcoin: версия, хеш, контрольная сумма |
QmQudp5N7EzTxrBk3yESEKyEroMYNd7R22G2KWffwNZyzq | 1220 262a86b6…e0882d8a | IPFS CIDv0: заголовок multihash SHA-256, 32-байтный хеш |
9Ajdvzr | 48656c6c6f | Текст Hello |
По байтам видна структура. 25 байт, начинающихся с 00 или 05, означают адрес Bitcoin с ещё не отрезанной контрольной суммой; 34 байта с началом 1220 указывают на CIDv0, а 32 байта без видимой структуры, скорее всего, окажутся открытым ключом.
Ведущие 1 означают нулевые байты
В Base58 каждая ведущая 1 декодируется в один байт 00, а остаток строки декодируется как одно число. Этот декодер сохраняет такие байты, поэтому адрес генезис-блока выше даёт 25 байт, а не 24. Декодер, который переводит только число, их теряет. Первым это выдаёт ключ на один байт короче нужного или контрольная сумма, которая никогда не сходится.
Правило работает и в обратную сторону: 1111 даёт четыре нулевых байта, а 2 – одиночный байт 01.
Когда декодирование не удаётся
- Неожиданный символ «0», «O», «I» или «l». Этих четырёх нет в алфавите Base58: их исключили, потому что они похожи на другие символы. Сообщение указывает позицию; обычно символ перепутали при переписывании.
- Неожиданный
+,/или=. Строка в Base64. Воспользуйтесь декодером Base64. - Ввод начинается с
bc1. Это адрес SegWit в Bech32, у этой кодировки свои контрольная сумма и алфавит. Здесь он либо не декодируется, либо даёт бессмысленные байты. - Hex правильный, но на 4 байта длиннее. Вы декодировали значение Base58Check как обычный Base58. Последние 4 байта занимает контрольная сумма; отбросьте их или используйте Base58Check.
- Ввод больше 64 КБ. Base58 рассматривает весь ввод как одно число, поэтому инструмент останавливается на 64 КБ, чтобы страница не зависала. Реальные значения Base58 укладываются в несколько десятков символов.
Base58 в hex на JavaScript
С BigInt конвертация получается короткой. Работает и в браузерах, и в Node.js:
const ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
function base58ToHex(s) {
let n = 0n;
for (const ch of s) {
const v = ALPHABET.indexOf(ch);
if (v < 0) throw new Error(`not Base58: ${ch}`);
n = n * 58n + BigInt(v);
}
let hex = n === 0n ? "" : n.toString(16);
if (hex.length % 2) hex = "0" + hex;
const zeros = s.length - s.replace(/^1+/, "").length;
return "00".repeat(zeros) + hex;
}
base58ToHex("1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa");
// '0062e907b15cbf27d5425399ebf6f0fb50ebb88f18c29b7d93'
Работа с байтами в JavaScript разобрана на странице про JavaScript.
Вопросы и ответы
Как декодировать адрес Solana?
Вставьте его сюда: в hex вы увидите 32-байтный открытый ключ Ed25519. Адрес System Program 11111111111111111111111111111111 декодируется в 32 нулевых байта: на нём хорошо видно правило ведущих нулей.
Почему мой адрес Bitcoin декодируется в 25 байт?
Классический адрес записан в Base58Check: 1 байт версии, 20-байтный хеш открытого ключа и 4-байтная контрольная сумма. Обычное декодирование Base58 возвращает все 25 байт. Декодер Base58Check проверит контрольную сумму и отрежет её за вас.
Почему декодер отвергает мою строку?
В Base58 нет 0, O, I и l, так что любой из них обычно означает опечатку или другую кодировку. Строка с +, / или = записана в Base64, а 0x… выдаёт hex.
Как перевести Base58 в hex на JavaScript?
Накапливайте BigInt цифра за цифрой, выведите его через toString(16), а затем добавьте 00 за каждую ведущую 1. Сниппет на этой странице показывает функцию целиком.