Base64를 Base58로 변환하는 방법
- 입력 · Base64에 Base64 문자열을 붙여넣으세요. 표준 문자와 URL-safe 문자 모두 되며,
=패딩 누락, 줄 바꿈,data:접두사도 괜찮습니다. - 출력 · Base58에서 결과를 확인하세요.
- 대상이 Bitcoin 방식 Base58이 아니라면 출력 아래에서 알파벳을 고르세요. Flickr와 Ripple은 같은 58개 문자를 다른 순서로 씁니다.
- 출력 복사를 누르거나, 방향 전환에서 Base58 → Base64를 클릭해 되돌리세요. Base58을 Base64로 페이지는 그 방향으로 시작합니다.
변환은 원시 바이트를 거칩니다. Base64를 디코딩하고 그 바이트를 Base58로 인코딩합니다. 더하거나 빼는 것이 없으므로 32바이트 키는 32바이트 키로 남습니다.
예시
| Base64 | Base58 | 내용 |
|---|---|---|
SGVsbG8= | 9Ajdvzr | 텍스트 Hello |
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= | 11111111111111111111111111111111 | 0 바이트 32개: Solana System Program |
Bt324ddloZPZy+FGzut5rBy0he1fWzeROoz1hX7/AKk= | TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA | Solana SPL Token 프로그램 ID |
Bt324ddloZPZy-FGzut5rBy0he1fWzeROoz1hX7_AKk | TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA | 같은 키를 패딩 없는 URL-safe Base64로 |
마지막 두 행은 같은 32바이트를 두 가지 Base64 표기로 쓴 것이므로 둘 다 같은 Base58이 나옵니다.
SHA-256 다이제스트로 IPFS CIDv0 만들기
CIDv0은 멀티해시의 Base58입니다. 즉 바이트 12(SHA-256)와 20(길이 32바이트) 다음에 다이제스트가 옵니다. 많은 도구가 SHA-256 다이제스트를 Base64로 출력하는데, 그것만 변환해서는 Qm… 문자열이 나오지 않습니다.
| 바이트 | Base64 | Base58 |
|---|---|---|
| 다이제스트만 | JiqGtnblhp7dXRrfj/0B1inDFUv96uz8jPoNkOCILYo= | 3Zz6yE7jDUVDb6doCEWrK58or4X2TmTLBiJeyWY4NHvq |
12 20 + 다이제스트 | EiAmKoa2duWGnt1dGt+P/QHWKcMVS/3q7PyM+g2Q4Igtig== | QmQudp5N7EzTxrBk3yESEKyEroMYNd7R22G2KWffwNZyzq |
두 번째 Base64 문자열 맨 앞의 EiA가 인코딩된 12 20 헤더이므로 Base64 멀티해시는 쉽게 알아볼 수 있습니다. 헤더를 직접 붙이려면 Base64를 Hex로로 다이제스트를 변환하고 앞에 1220을 붙인 다음, Base58 페이지에서 변환 전을 Hex로 설정해 그 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 입력도 받습니다. 이 함수는 Node의 Buffer에 의존하며, 자세한 내용은 Node.js에서 Base64에서 다룹니다.
자주 묻는 질문
바이트로 디코딩하지 않고 Base64를 Base58로 바꿀 수 있나요?
글자 단위로는 안 됩니다. Base64는 고정된 6비트 그룹을 대응시키지만 Base58은 바이트 전체를 하나의 수로 다루므로, 이 페이지를 포함한 모든 변환기는 먼저 Base64를 바이트로 디코딩한 뒤 그 바이트를 다시 인코딩합니다.
Base58 결과가 Base64보다 짧을 때가 있는 이유는 무엇인가요?
Base58에는 패딩이 없고, 앞쪽의 0 바이트는 각각 한 글자를 차지합니다. 32바이트는 Base64로 항상 44자(= 포함)지만 Base58로는 43자나 44자이며, 모든 바이트가 0일 때만 32자입니다.
Solana는 어떤 Base58 알파벳을 쓰나요?
Bitcoin 알파벳이며, 여기서도 기본값입니다. 필요하면 알파벳에서 Flickr와 Ripple을 고를 수 있습니다.
Base58 출력이 Qm으로 시작하지 않는 이유는 무엇인가요?
Qm은 2바이트 멀티해시 헤더 12 20에서 나옵니다. Base64에 32바이트 SHA-256 다이제스트만 들어 있다면 이 페이지의 설명대로 먼저 두 바이트를 앞에 붙이세요.