背景

近期发现一款很有意思的HarmonyOS 三方库, 地址 @pura/harmony-utils(V1.4.0) , 作者是"桃花镇童长老", 我这里也是直接通过该作者公布的源码进行案例编写进行,写了到目前写了一部分demo ,感觉确实很有帮助,这里呢也是开始写一个系列的演示demo 供大家参考。如有帮助可以在OpenHarmony中进行下载安装进行使用哦

案例demo导航展示

↓↓↓↓↓↓接下来言归正传 ↓↓↓↓

很多 HarmonyOS 初学者在遇到网络请求、文件读写、加密解密的时候,总会碰到各种编码格式:Base64、Uint8Array、ArrayBuffer、十六进制字符串……这些格式之间怎么互转?StrUtil 提供了一套完整的工具方法,这篇文章把它们全部说清楚。

方法总览

先搞懂为什么需要编码转换

在程序里,字符串在内存中实际上是一串字节。不同场景需要不同格式:

  • 网络传输图片/文件:通常需要 Base64 编码
  • 加密解密:通常需要 Uint8ArrayArrayBuffer
  • 十六进制调试:查看字节内容时用 Hex 格式更直观
  • 底层 API 调用:很多系统 API 需要 Uint8ArrayArrayBuffer 格式

StrUtil 提供了字符串和这些格式之间的双向转换

strToUint8Array / unit8ArrayToStr:字符串与字节数组互转

Uint8Array 是最基础的字节数组类型,把字符串转成 Uint8Array 就是按照 UTF-8 编码把每个字符拆成字节。

this.Btn('strToUint8Array("HarmonyOS")', '#148F77', () => {
  const arr = StrUtil.strToUint8Array('HarmonyOS');
  this.addLog(`strToUint8Array("HarmonyOS") → Uint8Array[${arr.length}] [${Array.from(arr.slice(0, 6)).join(',')}...]`);
})
this.Btn('unit8ArrayToStr(Uint8Array)', '#148F77', () => {
  const arr = StrUtil.strToUint8Array('HarmonyOS');
  const s = StrUtil.unit8ArrayToStr(arr);
  this.addLog(`unit8ArrayToStr(arr) → "${s}"`);
})

实际运行结果

  • strToUint8Array("HarmonyOS")Uint8Array[9] [72,97,114,109,111,110...]

这里 72 就是字母 H 的 ASCII 码,97a,以此类推。英文字符在 UTF-8 下每个字符一个字节,所以 9 个字母 = 长度 9 的数组。

还原回来:

  • unit8ArrayToStr(arr)"HarmonyOS"

使用场景:需要把字符串传给底层加密 API、哈希计算时,通常需要先转成 Uint8Array

strToBase64 / base64ToStr:Base64 编码互转

Base64 是把二进制数据转成纯文本格式的编码方式,常用于在文本协议(比如 JSON)里传输二进制数据,或者在 URL 里传递特殊字符。

this.Btn('strToBase64("HoUtils")', '#1F618D', () => {
  const b64 = StrUtil.strToBase64('HoUtils');
  this.addLog(`strToBase64("HoUtils") → "${b64}"`);
})
this.Btn('base64ToStr(base64) 还原字符串', '#1F618D', () => {
  const b64 = StrUtil.strToBase64('HoUtils');
  const s = StrUtil.base64ToStr(b64);
  this.addLog(`base64ToStr("${b64}") → "${s}"`);
})

实际运行结果

  • strToBase64("HoUtils")"SG9VdGlscw=="(这就是 Base64 编码后的样子)
  • base64ToStr("SG9VdGlscw==")"HoUtils"(还原回来)

Base64 字符串的特征:只包含字母、数字、+/,末尾可能有 = 号补位。

使用场景

  • 把图片数据编码成 Base64 传给接口
  • 解码服务端返回的 Base64 字符串
  • Token 里的 payload 部分(JWT 的中间段就是 Base64 编码的)

strToBuffer / bufferToStr:字符串与 ArrayBuffer 互转

ArrayBuffer 是另一种常见的字节容器,和 Uint8Array 的区别是:ArrayBuffer 是原始内存块,不直接支持索引访问;Uint8Array 是对 ArrayBuffer 的一个"视图",可以用 arr[0] 这样访问。

this.Btn('strToBuffer("ArkTS")', '#196F3D', () => {
  const buf = StrUtil.strToBuffer('ArkTS');
  this.addLog(`strToBuffer("ArkTS") → ArrayBuffer byteLength=${buf.byteLength}`);
})
this.Btn('bufferToStr(ArrayBuffer)', '#196F3D', () => {
  const buf = StrUtil.strToBuffer('ArkTS');
  const s = StrUtil.bufferToStr(buf);
  this.addLog(`bufferToStr(buf) → "${s}"`);
})

实际运行结果

  • strToBuffer("ArkTS")ArrayBuffer byteLength=5(5 个字母对应 5 字节)
  • bufferToStr(buf)"ArkTS"

使用场景:调用需要 ArrayBuffer 参数的底层 API,比如文件写入、WebSocket 二进制消息传输。

strToHex / hexToStr:字符串与十六进制互转

十六进制(Hex)格式在调试和密码学里很常见。每个字节用两个十六进制字符表示,比如字节 255"ff"

this.Btn('strToHex("ff00ab") 16进制字符串→Uint8Array', '#7E5109', () => {
  const arr = StrUtil.strToHex('ff00ab');
  this.addLog(`strToHex("ff00ab") → [${Array.from(arr).join(',')}]`);
})
this.Btn('hexToStr(Uint8Array) →16进制字符串', '#7E5109', () => {
  const arr = new Uint8Array([255, 0, 171]);
  const s = StrUtil.hexToStr(arr);
  this.addLog(`hexToStr([255,0,171]) → "${s}"`);
})

实际运行结果

  • strToHex("ff00ab")[255, 0, 171](把十六进制字符串解析成字节数组)
  • hexToStr([255, 0, 171])"ff00ab"(把字节数组转成十六进制字符串)

注意 strToHex 的参数是十六进制字符串(比如 "ff00ab"),不是普通文本。函数名有点容易让人误解,实际上做的是 “hex 字符串 → 字节数组”。

使用场景

  • 展示哈希值、加密密钥(通常以十六进制显示)
  • 解析十六进制格式的颜色值或二进制协议数据

strToBytes / bytesToStr:字节数组与字符串互转(简化版)

这对方法跟 strToUint8Array / unit8ArrayToStr 功能类似,可以理解为另一个版本的字符串字节转换:

this.Btn('strToBytes("Hi")', '#512E5F', () => {
  const arr = StrUtil.strToBytes('Hi');
  this.addLog(`strToBytes("Hi") → [${Array.from(arr).join(',')}]`);
})
this.Btn('bytesToStr([72,105])', '#512E5F', () => {
  const s = StrUtil.bytesToStr(new Uint8Array([72, 105]));
  this.addLog(`bytesToStr([72,105]) → "${s}"`);
})

实际运行结果

  • strToBytes("Hi")[72, 105](H=72, i=105)
  • bytesToStr([72, 105])"Hi"

编码转换方法对比速查

方法 输入 输出 典型场景
strToUint8Array 字符串 Uint8Array 加密/哈希计算
unit8ArrayToStr Uint8Array 字符串 解密结果转字符串
strToBase64 字符串 Base64 字符串 网络传输、JWT
base64ToStr Base64 字符串 字符串 解码 Base64
strToBuffer 字符串 ArrayBuffer 底层 API 调用
bufferToStr ArrayBuffer 字符串 接收字节数据后转文本
strToHex Hex 字符串 Uint8Array 解析十六进制数据
hexToStr Uint8Array Hex 字符串 展示字节内容
strToBytes 字符串 Uint8Array 通用字节操作
bytesToStr Uint8Array 字符串 字节转文本

写在最后

编码转换虽然听起来很"底层",但在实际开发里真的高频出现。接口返回 Base64 图片、加密 token、文件哈希……这些场景都需要用到这些方法。

把这张对照表收藏起来,遇到编码问题直接查。

下一篇聊 StrUtil 的 getErrnoToString——通过错误码快速定位系统错误信息。

Logo

免费领 150 小时云算力,进群参与显卡、AI PC 幸运抽奖

更多推荐