You need to enable JavaScript to run this app. JavaScript实现复古游戏短密码系统:压缩游戏数据并逆向还原
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript实现复古游戏短密码系统:压缩游戏数据并逆向还原

可行方案:基于大整数进制转换的压缩

为什么LZString压缩效率低

  • LZString是通用文本压缩算法,会把输入的每个数字当作8位ASCII字符处理,单个数字仅携带3.3比特有效信息(0-9的取值范围),冗余度极高,压缩后仍有大量无效占位。
  • 输入是纯结构化数字串,不存在大量重复文本模式,通用压缩算法的压缩率已接近上限,很难再缩短。

核心原理

所有十进制数字串本质是一个超长整数,直接将其从十进制转换为高进制编码,是理论压缩率最高的无损方案,也是老式NES游戏密码系统的原生实现逻辑。

  • 62进制(字符集为0-9、大小写字母)的单个字符可携带约6比特有效信息,同等信息量下的长度仅为十进制的1/6左右。
  • 无额外加密,可逆还原,输出字符均为可正常输入、无歧义的可见字符。
  • 按你给出的24位原始串"000102340000001000019531"计算,转换后密码长度约为14字符,完全在6-24的要求范围内。

直接可用的JS实现

字符集定义

选用无歧义的62位字符集,如果需要避免用户输入混淆,可以移除易混字符(0、O、l、1),使用58位字符集,长度仅小幅增加,输入体验更接近复古游戏机的密码规则:
const CHARSET = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

十进制数字串转62进制密码

/**
 * @param {string} decStr 原始定长十进制数字串
 * @returns {string} 压缩后的短密码
 */
function decToPassword(decStr) {
  const num = BigInt(decStr);
  const base = BigInt(CHARSET.length);
  if (num === 0n) return CHARSET[0];
  let res = '';
  let temp = num;
  while (temp > 0n) {
    res = CHARSET[Number(temp % base)] + res;
    temp = (temp - (temp % base)) / base;
  }
  return res;
}

密码还原为原始十进制串

/**
 * @param {string} pwd 压缩后的密码
 * @param {number} fixedLength 原始数字串的固定长度(用于补前导零)
 * @returns {string} 还原后的原始数字串
 */
function passwordToDec(pwd, fixedLength) {
  let num = 0n;
  const base = BigInt(CHARSET.length);
  for (let c of pwd) {
    num = num * base + BigInt(CHARSET.indexOf(c));
  }
  // 补前导零到固定长度,匹配原始数据格式
  return num.toString().padStart(fixedLength, '0');
}

长度优化调整

如果按当前十进制存储规则,25组共200位十进制数字转62进制后约为112字符,仍达不到你要求的24字符上限,可直接调整底层存储规则:

  • 先按每个标记的实际取值范围打包成二进制流:布尔值(仅0/1)占1比特,0-9的数字占4比特,0-99的数字占7比特,无需强制用1位十进制字符存储每个标记。
  • 打包完成后再将整个二进制流转大整数,最后编码为62进制。
  • 按200个标记、平均每个标记占0.7比特(大部分为布尔值)计算,总比特数约140,转换为62进制后仅需24个字符以内,完全符合需求。

关于“大数字转公式”的方案

该方案仅适用于数字存在大量连续0的稀疏场景(比如10^100直接写为1e100),如果数字是均匀分布的游戏状态值,没有大量冗余的0,该方案反而会增加长度,不适合当前场景。

内容的提问来源于stack exchange,提问作者Partack

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.22 08:06:03