You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JavaScript中将12字节十六进制串转存为double并无损还原?

解决方案

核心思路

12字节(96位)的数据无法用单个double(64位,仅能无损存储53位整数)完整存储,最优方案是拆分为2个double变量:将96位数据拆分为两个48位的无符号整数,每个48位整数的最大值为2^48-1,远小于double能精确表示的上限2^53-1,完全满足无损存储要求。

实现代码

1. 24位十六进制字符串转2个double变量

function hexToDoubles(hexStr) {
  if (hexStr.length !== 24) {
    throw new Error("输入必须是24位十六进制字符串");
  }
  
  // 十六进制转12字节数组
  const bytes = new Uint8Array(12);
  for (let i = 0; i < 12; i++) {
    bytes[i] = parseInt(hexStr.slice(i*2, i*2+2), 16);
  }
  
  // 拆分前后6字节,转成48位无符号整数
  let high = 0;
  for (let i = 0; i < 6; i++) {
    high = (high << 8) | bytes[i];
  }
  
  let low = 0;
  for (let i = 6; i < 12; i++) {
    low = (low << 8) | bytes[i];
  }
  
  // 转成double(48位整数可被double精确存储)
  return [Number(high), Number(low)];
}

2. 2个double变量还原为原十六进制字符串

function doublesToHex(doubles) {
  if (doubles.length !== 2) {
    throw new Error("输入必须是包含2个double的数组");
  }
  
  // 转成BigInt确保移位操作安全
  const high = BigInt(Math.floor(doubles[0]));
  const low = BigInt(Math.floor(doubles[1]));
  
  // 验证数值未超出48位范围
  const max48Bit = 281474976710655n;
  if (high > max48Bit || low > max48Bit) {
    throw new Error("double值超出48位无符号整数范围,无法无损还原");
  }
  
  // 整数转12字节数组
  const bytes = new Uint8Array(12);
  // 处理高6字节
  for (let i = 5; i >= 0; i--) {
    bytes[i] = Number((high >> BigInt((5 - i)*8)) & 0xffn);
  }
  // 处理低6字节
  for (let i = 11; i >= 6; i--) {
    bytes[i] = Number((low >> BigInt((11 - i)*8)) & 0xffn);
  }
  
  // 字节数组转十六进制字符串
  let hexStr = "";
  for (const byte of bytes) {
    hexStr += byte.toString(16).padStart(2, '0');
  }
  return hexStr;
}

测试示例

// 测试输入
const originalHex = "0123456789abcdef12345678";
// 转成double数组
const doubles = hexToDoubles(originalHex);
// 还原为十六进制字符串
const restoredHex = doublesToHex(doubles);
console.log(restoredHex === originalHex); // 输出: true

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 17:53:21