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

如何在TypeScript中实现二进制数据字符串的编解码

解决方案

你拿到的是按单字节规则(Latin1/ISO-8859-1)编码的二进制字符串,直接用默认UTF-8规则转换ArrayBuffer/Uint8Array时,非法字节序列会被替换为乱码占位符,导致原始数据丢失、转换失败。

1. 把现有二进制字符串还原为原始二进制数据

你可以先通过charCodeAt逐字符读取码点,直接映射为字节值,全程不会丢失数据,全环境兼容:

function binaryStringToUint8Array(str: string): Uint8Array {
  const uint8 = new Uint8Array(str.length);
  for (let i = 0; i < str.length; i++) {
    uint8[i] = str.charCodeAt(i);
  }
  return uint8;
}

2. 二进制数据与合法普通字符串互转

方案1:Base64编解码(推荐,兼容性最高)

Base64会把任意二进制数据转为仅包含可打印ASCII字符的字符串,无任何非法字符,适合接口传输、本地存储等绝大多数场景。

浏览器环境实现:

// Uint8Array 转 Base64 字符串
function uint8ArrayToBase64(uint8: Uint8Array): string {
  return btoa(String.fromCharCode.apply(null, uint8 as unknown as number[]));
}

// Base64 字符串转回 Uint8Array
function base64ToUint8Array(base64: string): Uint8Array {
  const binaryStr = atob(base64);
  return binaryStringToUint8Array(binaryStr);
}

Node.js环境实现:

// Uint8Array 转 Base64 字符串
function uint8ArrayToBase64(uint8: Uint8Array): string {
  return Buffer.from(uint8).toString('base64');
}

// Base64 字符串转回 Uint8Array
function base64ToUint8Array(base64: string): Uint8Array {
  return Buffer.from(base64, 'base64');
}

方案2:十六进制(Hex)编解码(适合调试)

Hex编码会把每个字节转为两位十六进制字符,可读性更高,适合开发调试阶段使用,缺点是体积是原始数据的2倍,比Base64占用更多空间。

// Uint8Array 转 Hex 字符串
function uint8ArrayToHex(uint8: Uint8Array): string {
  return Array.from(uint8, byte => byte.toString(16).padStart(2, '0')).join('');
}

// Hex 字符串转回 Uint8Array
function hexToUint8Array(hex: string): Uint8Array {
  const uint8 = new Uint8Array(hex.length / 2);
  for (let i = 0; i < hex.length; i += 2) {
    uint8[i / 2] = parseInt(hex.slice(i, i + 2), 16);
  }
  return uint8;
}

注意事项

  • 不要直接使用TextEncoder/TextDecoder处理这类原始二进制字符串:两个API默认按UTF-8规则编解码,遇到非法字节序列会直接替换为�占位符,永久丢失原始数据。
  • 可以查阅你所用的Signal协议库文档,优先选择直接返回Uint8Array类型的加密接口,省略二进制字符串转换步骤,降低出错概率。
  • Base64编码后体积为原始二进制的4/3,Hex编码为2倍,可根据使用场景选择合适的编码方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 19:54:03