在JavaScript/jQuery中如何将BASE58格式Solana地址转换为Uint8数组
Base58解码转Uint8Array实现方案
jQuery本身只封装了DOM操作、Ajax等前端常用能力,没有内置Base58编解码相关的API,所以无需通过jQuery实现该功能,以下为JavaScript环境下的两种实现方式:
方案1:使用现有依赖(推荐生产环境使用)
如果你已经在项目中对接Solana生态,直接使用@solana/web3.js内置的解码方法即可,不用额外引入其他工具:
import { PublicKey } from '@solana/web3.js'; const address = "9vpsmXhZYMpvhCKiVoX5U8b1iKpfwJaFpPEEXF7hRm9N"; const uint8Array = new PublicKey(address).toBytes(); console.log(uint8Array); // 输出符合要求的Uint8数组
如果不需要引入完整的Solana SDK,也可以使用独立的bs58解码库:
import bs58 from 'bs58'; const address = "9vpsmXhZYMpvhCKiVoX5U8b1iKpfwJaFpPEEXF7hRm9N"; const uint8Array = bs58.decode(address); console.log(uint8Array);
方案2:纯原生JavaScript实现(无任何依赖)
如果不想引入第三方依赖,可以直接使用下面的原生实现,兼容所有浏览器和Node.js环境:
const address = "9vpsmXhZYMpvhCKiVoX5U8b1iKpfwJaFpPEEXF7hRm9N"; // 纯JS实现Base58解码 function bs58Decode(base58Str) { const ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'; const ALPHABET_MAP = {}; for (let i = 0; i < ALPHABET.length; i++) { ALPHABET_MAP[ALPHABET[i]] = i; } if (base58Str.length === 0) return new Uint8Array(); const bytes = [0]; for (let i = 0; i < base58Str.length; i++) { const c = base58Str[i]; if (!(c in ALPHABET_MAP)) { throw new Error('无效的Base58字符'); } let carry = ALPHABET_MAP[c]; for (let j = 0; j < bytes.length; j++) { carry += bytes[j] * 58; bytes[j] = carry & 0xff; carry >>= 8; } while (carry > 0) { bytes.push(carry & 0xff); carry >>= 8; } } // 处理前导1 let leadingZeros = 0; while (base58Str[leadingZeros] === '1') { leadingZeros++; } return new Uint8Array(Array(leadingZeros).fill(0).concat(bytes.reverse())); } // 调用方法 const result = bs58Decode(address); console.log(result); // 输出结果和你给出的预期格式一致
内容的提问来源于stack exchange,提问作者Nancy Moore
相关产品推荐
相关产品推荐

