在短链接生成、数据压缩和加密算法中,进制转换技术扮演着关键角色。本文将彻底解析2-62进制转换的核心原理,并提供生产级实现方案,突破编程语言36进制的限制。
进制转换本质是基数权重的重新分配:
其他进制 → 10进制:按位展开求和
123₈ = 1×8² + 2×8¹ + 3×8⁰ = 83₁₀
10进制 → 其他进制:短除法取余逆序
83₁₀ ÷ 8 = 10 余 3 → 10 ÷ 8 = 1 余 2 → 1 ÷ 8 = 0 余 1 → 123₈
// 62进制字符映射表
const charMap = {
// 数字 -> 字符
encode: (num) => "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"[num],
// 字符 -> 数字
decode: (char) => {
const code = char.charCodeAt(0);
if (code >= 48 && code <= 57) return code - 48; // 0-9
if (code >= 97 && code <= 122) return code - 87; // a-z
if (code >= 65 && code <= 90) return code - 29; // A-Z
throw new Error(`非法字符: ${char}`);
}
};
function toDecimal(numStr, base) {
let result = 0;
for (let i = 0; i < numStr.length; i++) {
const digit = charMap.decode(numStr[i]);
if (digit >= base) throw new Error(`数字${numStr[i]}在${base}进制中无效`);
result = result * base + digit;
}
return result;
}
// 测试用例
toDecimal("7aZ", 62); // 27589 (1*62² + 36*62 + 61)
function fromDecimal(number, base) {
if (number === 0) return "0";
let result = "";
let num = number;
while (num > 0) {
const remainder = num % base;
result = charMap.encode(remainder) + result;
num = Math.floor(num / base);
}
return result;
}
// 测试用例
fromDecimal(27589, 62); // "7aZ"
function convertBase(numStr, fromBase, toBase) {
// 相同进制直接返回
if (fromBase === toBase) return numStr;
// 特殊值处理
if (numStr === "0" || numStr === "") return "0";
// 转换流程
const decimal = toDecimal(numStr, fromBase);
return fromDecimal(decimal, toBase);
}
// 测试用例
convertBase("7aZ", 62, 16); // "6BC5"
convertBase("1101", 2, 16); // "D"
// 36进制内快捷转换
const quickConvert = (num, from, to) =>
parseInt(num, from).toString(to);
// 使用示例
quickConvert("2e", 16, 10); // "46"
quickConvert("z", 36, 16); // "23"
// 扩展内置方法(62进制支持)
Number.prototype.toBase = function(base) {
return fromDecimal(Math.abs(this), base);
};
String.prototype.fromBase = function(base) {
return toDecimal(this, base);
};
// 使用示例
(27589).toBase(62); // "7aZ"
"7aZ".fromBase(62); // 27589
function bigConvert(numStr, fromBase, toBase) {
let decimal = 0n;
const bigFromBase = BigInt(fromBase);
// 大数转十进制
for (const char of numStr) {
decimal = decimal * bigFromBase + BigInt(charMap.decode(char));
}
// 转目标进制
if (toBase === 10) return decimal.toString();
let result = "";
let current = decimal;
const bigToBase = BigInt(toBase);
while (current > 0n) {
const remainder = current % bigToBase;
result = charMap.encode(Number(remainder)) + result;
current = current / bigToBase;
}
return result || "0";
}
// 测试50位大数
bigConvert("7aZk8P3qR7sT9wX0yV2".repeat(5), 62, 16);
// 缓存优化(减少重复计算)
const base62Cache = new Map();
function cachedConvert(numStr) {
if (base62Cache.has(numStr)) return base62Cache.get(numStr);
const result = convertBase(numStr, 10, 62);
base62Cache.set(numStr, result);
return result;
}
// 批量处理
function batchConvert(items, from, to) {
return items.map(num => convertBase(num, from, to));
}
function generateShortLink(id) {
return convertBase(id.toString(), 10, 62).padStart(6, '0');
}
generateShortLink(1258963); // "1Kc3"
// ASCII转高进制压缩
function compressText(text) {
const asciiCodes = text.split('').map(c => c.charCodeAt(0));
const combined = asciiCodes.reduce((acc, cur) => acc * 256 + cur, 0);
return convertBase(combined.toString(), 10, 62);
}
// 解压
function decompressText(compressed) {
const decimal = parseInt(convertBase(compressed, 62, 10));
// ... 反向解析ASCII
}
边界情况 | 处理方案 | 示例 |
---|---|---|
输入值为0 | 直接返回"0" | convertBase("0", 10, 62) |
非法字符 | 抛出明确错误 | convertBase("12@", 10, 62) |
超范围进制 | 参数验证拦截 | convertBase("10", 1, 63) |
空字符串输入 | 返回"0" | convertBase("", 10, 16) |
大小写敏感问题 | 统一转换为小写处理 | 预处理toLowerCase() |
本文实现的进制转换方案具备:
全进制支持:完整覆盖2-62进制范围
大数兼容:BigInt处理超长数字
生产级健壮性:完善的边界处理
跨平台能力:算法可移植到Python/Java等语言
性能优化方向:
WebAssembly加速核心计算逻辑
多线程并行处理批量转换
建立常用转换的预计算缓存
使用TypedArray优化内存占用
自己的解题思路是将十进制的数转为二进制(不足32位补0),然后依次取8位转化为十进制的数字,再用.连接即为IP。里面的几个点记录一下:十进制转换为二进制 numObj.toString([radix]) radix可以指定进制
参数radix支持 [2, 36] 之间的整数。例如:参数值为2,则表示二进制;为8,则表示八进制;为16,则表示十六进制。如果省略参数radix,则默认为10(十进制)。
最近在用 shell 写一个小工具,里面要用到复杂的二进制操作,对 int 值进行位操作和与或非,而 shell 的语法里, & 是取布尔与, >> 是重定向,不支持二进制操作,为了写出只需要默认系统环境就可以运行的程序
js 进制转换支持 2-36 , 即 0-9a-z .可以用于混淆、数值缩短、特殊符号转换…字符串36进制编码解码;ip地址端口号36进制编码解码
JavaScript中有很多内置函数可以帮我们进行数(进)制转换。那么给定一个十进制数字,如何将数字从十进制转换为十六进制?下面本篇文章就来给大家介绍一个使用JavaScript将十进制转换为十六进制的方法
在一般的代码中很少会接触到进制和位运算,但这不代表我们可以不去学习它。作为一位编程人员,这些都是基础知识。如果你没有学过这方面的知识,也不要慌,接下来的知识并不会很难。本文你将会学习到:进制转换,按位操作符,Javascript进制转换
在客户端javascript脚本代码中,对于二进制数据并没有提供一个很好的支持。然后在nodejs中需要处理像TCP流或文件流时,必须要处理二进制数据。因此在node.js中,定义了一个Buffer类,该类用来创建一个专门存放二进制数据的缓存区
将十进制数 x 除以 16, 即 x = q * 16 + r,取得余数 r 和 商 q,此时余数 r 就是 x 用十六进制表示时的最低位值; 之后商值 q 继续进行以上的除法操作, 获取每次的余数 r 作为 十六进制表示时的低位值, 直到 q 值小于 16 为值, 此时的
位运算符是基于二级制数进行操作的,即表示数字的 32 个数位,它由0和1组成…ECMAScript整数有两种类型,即有符号整数(允许用正数和负数)和无符号整数(只允许用正数)
JavaScript 中提供的进制表示方法有四种:十进制、二进制、十六进制、八进制。对于数值字面量,主要使用不同的前缀来区分:
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!