news 2026/5/30 16:45:37

HarmonyOS StrUtil 编码转换全指南:Uint8Array、Base64、Hex、Buffer 互转实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
HarmonyOS StrUtil 编码转换全指南:Uint8Array、Base64、Hex、Buffer 互转实战

文章目录

    • 背景
      • 方法总览
      • 先搞懂为什么需要编码转换
      • strToUint8Array / unit8ArrayToStr:字符串与字节数组互转
      • strToBase64 / base64ToStr:Base64 编码互转
      • strToBuffer / bufferToStr:字符串与 ArrayBuffer 互转
      • strToHex / hexToStr:字符串与十六进制互转
      • strToBytes / bytesToStr:字节数组与字符串互转(简化版)
      • 编码转换方法对比速查
      • 写在最后

背景

近期发现一款很有意思的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',()=>{constarr=StrUtil.strToUint8Array('HarmonyOS');this.addLog(`strToUint8Array("HarmonyOS") → Uint8Array[${arr.length}] [${Array.from(arr.slice(0,6)).join(',')}...]`);})this.Btn('unit8ArrayToStr(Uint8Array)','#148F77',()=>{constarr=StrUtil.strToUint8Array('HarmonyOS');consts=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',()=>{constb64=StrUtil.strToBase64('HoUtils');this.addLog(`strToBase64("HoUtils") → "${b64}"`);})this.Btn('base64ToStr(base64) 还原字符串','#1F618D',()=>{constb64=StrUtil.strToBase64('HoUtils');consts=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',()=>{constbuf=StrUtil.strToBuffer('ArkTS');this.addLog(`strToBuffer("ArkTS") → ArrayBuffer byteLength=${buf.byteLength}`);})this.Btn('bufferToStr(ArrayBuffer)','#196F3D',()=>{constbuf=StrUtil.strToBuffer('ArkTS');consts=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',()=>{constarr=StrUtil.strToHex('ff00ab');this.addLog(`strToHex("ff00ab") → [${Array.from(arr).join(',')}]`);})this.Btn('hexToStr(Uint8Array) →16进制字符串','#7E5109',()=>{constarr=newUint8Array([255,0,171]);consts=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',()=>{constarr=StrUtil.strToBytes('Hi');this.addLog(`strToBytes("Hi") → [${Array.from(arr).join(',')}]`);})this.Btn('bytesToStr([72,105])','#512E5F',()=>{consts=StrUtil.bytesToStr(newUint8Array([72,105]));this.addLog(`bytesToStr([72,105]) → "${s}"`);})

实际运行结果

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

编码转换方法对比速查

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

写在最后

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

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

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/30 16:44:49

OxyPlot数据可视化引擎架构解析与跨平台实现方案

OxyPlot数据可视化引擎架构解析与跨平台实现方案 【免费下载链接】oxyplot A cross-platform plotting library for .NET 项目地址: https://gitcode.com/gh_mirrors/ox/oxyplot OxyPlot作为一款功能强大的跨平台.NET绘图库,为技术决策者和架构师提供了在WPF…

作者头像 李华
网站建设 2026/5/30 16:44:10

ESP8266-01s烧录MQTT固件避坑指南:从选固件到接线,一次搞定阿里云连接

ESP8266-01s烧录MQTT固件实战手册:从硬件选型到云端对接全解析当你第一次拿到ESP8266-01s这个火柴盒大小的物联网模块时,可能会被它简陋的外观所迷惑——这个售价不到10元的小玩意儿,实际上隐藏着连接物理世界与数字世界的钥匙。作为物联网开…

作者头像 李华
网站建设 2026/5/30 16:44:09

ESP8266驱动OLED动画:从像素编辑到代码自动生成的机器人眼睛方案

1. 项目概述与核心价值最近在捣鼓一个机器人头部项目,想给它加上一双能表达情绪的“眼睛”。市面上常见的方案要么是点阵屏,要么是LED阵列,但总觉得不够细腻,功耗也高。后来把目光投向了0.96英寸的12864 OLED屏,这东西…

作者头像 李华
网站建设 2026/5/30 16:42:57

终极窗口分辨率控制指南:SRWE让你轻松突破游戏窗口限制

终极窗口分辨率控制指南:SRWE让你轻松突破游戏窗口限制 【免费下载链接】SRWE Simple Runtime Window Editor 项目地址: https://gitcode.com/gh_mirrors/sr/SRWE 你是否曾经因为游戏窗口分辨率不足而烦恼?是否想在窗口模式下获得全屏的沉浸体验&…

作者头像 李华
网站建设 2026/5/30 16:42:54

基于Arduino与NeoPixel的桌面级LED轮盘游戏机DIY全攻略

1. 项目概述:从零打造一台桌面级LED轮盘游戏机 几年前,我在一个电子创客社区里第一次看到用LED灯带模拟轮盘赌转动的点子,当时就觉得这玩意儿既有技术挑战性,又有十足的趣味性。传统的轮盘赌机体积庞大、结构复杂,但用…

作者头像 李华