Base58을 디코딩하는 방법
- 입력 · Base58에 문자열을 붙여넣으세요. 공백과 줄 바꿈은 무시됩니다.
- 출력 · Hex에서 바이트를 읽으세요. 출력 아래에서 대소문자를 바꾸거나, 공백이나
:같은 구분자를 넣거나, 줄당 바이트 수를 16이나 32로 나눌 수 있습니다. - 비트코인 방식의 Base58이 아니라면 입력 아래의 알파벳을 Flickr나 Ripple로 바꾸세요.
- 다른 형태로 보려면 변환 후를 바꾸세요. 데이터가 문자열이었다면 텍스트를, API나 설정 파일용이라면 Base64를 고르세요. 이 변환을 위해 따로 만든 페이지가 Base58을 Base64로입니다.
- 출력 복사, hex 다운로드, 또는 바이트 저장으로 디코딩한 바이트를 파일로 받으세요.
흔한 Base58 문자열의 디코딩 결과
| Base58 | 바이트 (hex) | 정체 |
|---|---|---|
11111111111111111111111111111111 | 32 × 00 | 솔라나 System Program (0으로 된 32바이트 키) |
TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA | 06ddf6e1d765…7eff00a9 (32바이트) | 솔라나 SPL Token 프로그램 ID |
1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa | 00 62e907b1…ebb88f18 c29b7d93 | 비트코인 제네시스 블록 주소: 버전, 해시, 체크섬 |
QmQudp5N7EzTxrBk3yESEKyEroMYNd7R22G2KWffwNZyzq | 1220 262a86b6…e0882d8a | IPFS CIDv0: SHA-256 multihash 헤더, 32바이트 다이제스트 |
9Ajdvzr | 48656c6c6f | 텍스트 Hello |
바이트를 읽으면 구조를 알 수 있습니다. 00이나 05로 시작하는 25바이트 결과는 체크섬이 아직 붙어 있는 비트코인 주소이고, 1220으로 시작하는 34바이트 결과는 CIDv0이며, 눈에 띄는 구조가 없는 32바이트는 공개 키일 가능성이 가장 높습니다.
앞쪽의 1은 0 바이트입니다
Base58에서 앞쪽의 1은 각각 00 바이트 하나로 디코딩되고, 나머지 문자열은 하나의 수로 디코딩됩니다. 이 디코더는 그 바이트를 유지하므로 위의 제네시스 주소는 24바이트가 아니라 25바이트를 돌려줍니다. 수만 변환하는 디코더는 이 바이트를 잃어버리며, 대개 키가 1바이트 짧거나 체크섬이 절대 맞지 않는 것으로 처음 드러납니다.
규칙은 반대로도 적용됩니다. 1111은 0 바이트 네 개이고, 2는 바이트 01 하나입니다.
디코딩이 실패할 때
- 예상하지 못한 문자
"0","O","I","l". 이 네 문자는 다른 문자와 비슷해 보여서 Base58 알파벳에서 빠졌습니다. 오류가 위치를 알려 주며, 대개 옮겨 적다가 생긴 실수입니다. - 예상하지 못한
+,/,=. 문자열이 Base64입니다. Base64 디코더를 쓰세요. - 입력이
bc1로 시작합니다. 고유한 체크섬과 알파벳을 가진 다른 인코딩인 Bech32 SegWit 주소입니다. 여기서는 실패하거나 의미 없는 바이트로 디코딩됩니다. - hex는 맞는데 4바이트가 깁니다. Base58Check 값을 일반 Base58로 디코딩한 것입니다. 마지막 4바이트가 체크섬이므로 떼어 내거나 Base58Check를 쓰세요.
- 입력이 64 KB를 넘습니다. Base58은 입력 전체를 하나의 수로 다루므로, 도구는 응답성을 유지하기 위해 64 KB에서 멈춥니다. 실제 Base58 값은 수십 자 정도입니다.
JavaScript에서 Base58을 hex로 디코딩하기
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 페이지를 참고하세요.
자주 묻는 질문
솔라나 주소는 어떻게 디코딩하나요?
여기에 붙여넣으세요. hex 출력이 32바이트 Ed25519 공개 키입니다. System Program 주소 11111111111111111111111111111111은 0 바이트 32개로 디코딩되므로, 앞쪽 0 규칙이 어떻게 동작하는지 바로 볼 수 있습니다.
비트코인 주소가 왜 25바이트로 디코딩되나요?
레거시 주소는 Base58Check입니다. 버전 1바이트, 20바이트 공개 키 해시, 4바이트 체크섬으로 이루어집니다. 일반 Base58 디코딩은 25바이트 전부를 돌려줍니다. Base58Check 디코더는 체크섬을 검증하고 떼어 줍니다.
디코더가 왜 제 문자열을 거부하나요?
Base58에는 0, O, I, l이 없으므로 이 중 하나가 있다면 대개 오타이거나 다른 인코딩입니다. +, /, =가 있는 문자열은 Base64이고, 0x…는 hex입니다.
JavaScript에서 Base58을 hex로 바꾸려면 어떻게 하나요?
BigInt에 한 자리씩 곱해 올린 뒤 toString(16)으로 출력하고, 앞쪽의 1 하나마다 00을 붙이세요. 이 페이지의 코드에 함수 전체가 있습니다.