当前位置: 首页 > news >正文

HarmonyOS Base64Util 同步 vs 异步:六个方法该怎么选?

文章目录

    • 前言
    • 一、同步版本解析
      • encodeSync
      • encodeToStrSync
      • decodeSync
    • 二、异步版本解析
      • encode
      • encodeToStr
      • decode
    • 三、Demo 中的四种组合
    • 四、选型矩阵
    • 五、关于 util.Type 参数
    • 六、常见踩坑
      • 踩坑1:同步方法在大文件上卡 UI
      • 踩坑2:解码失败没有 try-catch
      • 踩坑3:混用编码类型
    • 七、总结

前言

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

案例demo导航展示

↓↓↓↓↓↓接下来言归正传 ↓↓↓↓
Base64Util 有 6 个方法,其中同步 3 个、异步 3 个,一一对应:

encode ↔ encodeSync encodeToStr ↔ encodeToStrSync decode ↔ decodeSync

很多人看到有异步就直接用异步,看到有同步就觉得"同步方便直接用同步"。

但这两种选法都不严谨。正确的做法是根据数据量大小和调用场景来选

一、同步版本解析

encodeSync

staticencodeSync(array:Uint8Array):Uint8Array{constbase64=newutil.Base64Helper();constresult=base64.encodeSync(array);returnresult;}

特点

  • 直接返回值,不需要await
  • 在当前线程执行,会阻塞主线程
  • 适合小数据量(几KB以内)

encodeToStrSync

staticencodeToStrSync(array:Uint8Array,options?:util.Type):string{constbase64=newutil.Base64Helper();constresult=base64.encodeToStringSync(array,options);returnresult;}

最常用的同步方法:直接返回 Base64 字符串,不需要await,不需要转换,拿来即用。

decodeSync

staticdecodeSync(array:Uint8Array|string,options?:util.Type):Uint8Array{constbase64=newutil.Base64Helper();constresult=base64.decodeSync(array,options);returnresult;}

接受Uint8Arraystring(Base64 字符串),直接返回Uint8Array

二、异步版本解析

encode

staticencode(array:Uint8Array):Promise<Uint8Array>{constbase64=newutil.Base64Helper();returnbase64.encode(array);}

返回Promise<Uint8Array>,必须用await.then()处理结果。

encodeToStr

staticencodeToStr(array:Uint8Array,options?:util.Type):Promise<string>{constbase64=newutil.Base64Helper();returnbase64.encodeToString(array,options);}

最常用的异步方法:返回Promise<string>,适合大文件编码或在 async 函数中调用。

decode

staticdecode(array:Uint8Array|string,options?:util.Type):Promise<Uint8Array>{constbase64=newutil.Base64Helper();returnbase64.decode(array,options);}

三、Demo 中的四种组合

Base64DemoPage.ets演示了所有四种编解码组合:

asyncrunEncode(){constraw=this.textToUint8Array(this.inputText);this.addLog('输入',`原文长度:${raw.length}字节`,'info');if(this.syncMode){// 同步模式if(this.toStrMode){// 组合一:同步编码 → 字符串constencoded=Base64Util.encodeToStrSync(raw);constdecodedRaw=Base64Util.decodeSync(encoded);constdecoded=this.uint8ArrayToText(decodedRaw);this.results=[{label:'encodeToStrSync',value:encoded,byteLen:raw.length},{label:'decodeSync→Str',value:decoded,byteLen:decoded.length},];this.addLog('Sync','encodeToStrSync + decodeSync 完成','success');}else{// 组合二:同步编码 → Uint8Arrayconstencoded=Base64Util.encodeSync(raw);constdecoded=Base64Util.decodeSync(encoded);this.results=[{label:'encodeSync (Uint8Array)',value:this.uint8ArrayToText(encoded),byteLen:raw.length},{label:'decodeSync (Uint8Array)',value:this.uint8ArrayToText(decoded),byteLen:decoded.length},];this.addLog('Sync','encodeSync + decodeSync 完成','success');}}else{// 异步模式if(this.toStrMode){// 组合三:异步编码 → 字符串constencoded=awaitBase64Util.encodeToStr(raw);constdecodedRaw=awaitBase64Util.decode(encoded);constdecoded=this.uint8ArrayToText(decodedRaw);this.results=[{label:'encodeToStr (Promise)',value:encoded,byteLen:raw.length},{label:'decode (Promise)→Str',value:decoded,byteLen:decoded.length},];this.addLog('Async','encodeToStr + decode 完成','success');}else{// 组合四:异步编码 → Uint8Arrayconstencoded=awaitBase64Util.encode(raw);constdecoded=awaitBase64Util.decode(encoded);this.results=[{label:'encode (Promise)',value:this.uint8ArrayToText(encoded),byteLen:raw.length},{label:'decode (Promise)',value:this.uint8ArrayToText(decoded),byteLen:decoded.length},];this.addLog('Async','encode + decode 完成','success');}}}

解码演示(独立 Tab):

asyncrunDecode(){if(this.inputText.trim()===''){this.addLog('解码','请输入 Base64 字符串','warn');return;}try{letdecoded:Uint8Array;if(this.syncMode){decoded=Base64Util.decodeSync(this.inputText.trim());}else{decoded=awaitBase64Util.decode(this.inputText.trim());}consttext=this.uint8ArrayToText(decoded);this.results=[{label:'解码结果',value:text,byteLen:decoded.length},];this.addLog('解码',`解码成功${decoded.length}字节`,'success');}catch(e){this.addLog('解码',`解码失败:${(easError).message}`,'error');}}

四、选型矩阵

场景数据量推荐方法原因
编码小图标/小图片< 1KBencodeToStrSync同步简洁,数据量小不卡
编码大图片/文件> 100KBencodeToStr(async)大数据异步,不阻塞 UI
解码服务器 Token几十字节decodeSync同步即可,超小数据
解码大文件> 100KBdecode(async)异步解码,避免卡顿
需要继续传给其他方法任意看下游是否异步链路保持链路一致性
aboutToAppear中初始化任意Sync版本生命周期不是 async

五、关于 util.Type 参数

所有方法都有一个可选的options?: util.Type参数,用于指定 Base64 编码的变体:

说明
util.Type.BASIC标准 Base64(默认,使用+/,末尾补=
util.Type.MIMEMIME 格式,每 76 字符加一个换行\r\n
util.Type.URL_SAFEURL 安全格式,用-替代+_替代/
util.Type.BASIC_URL_SAFEURL 安全但不补=

大多数场景用默认值(不传 options)即可。如果编码结果要放进 URL 参数里,应该用util.Type.URL_SAFE,否则+/在 URL 中有特殊含义会出问题。


六、常见踩坑

踩坑1:同步方法在大文件上卡 UI

// ❌ 大文件用同步会冻结界面constbigFile:Uint8Array=...// 5MB 图片constencoded=Base64Util.encodeToStrSync(bigFile);// 卡住 UI// ✅ 改用异步constencoded=awaitBase64Util.encodeToStr(bigFile);// 不阻塞

踩坑2:解码失败没有 try-catch

// ❌ 没有处理解码失败constdecoded=Base64Util.decodeSync(invalidBase64String);// 可能抛出// ✅ 包一层 try-catchtry{constdecoded=Base64Util.decodeSync(invalidBase64String);}catch(e){console.error('解码失败:',(easError).message);}

Base64 字符串如果不合法(含有非法字符、长度不对),decodeSync会抛异常。

踩坑3:混用编码类型

// ❌ 用 URL_SAFE 编码,却用默认选项解码constencoded=Base64Util.encodeToStrSync(data,util.Type.URL_SAFE);constdecoded=Base64Util.decodeSync(encoded);// 可能出错!// ✅ 编解码选项要一致constdecoded=Base64Util.decodeSync(encoded,util.Type.URL_SAFE);

七、总结

选型口诀

  • 数据小(< 10KB)→ 用 Sync
  • 数据大(> 100KB)→ 用 async/await
  • 不确定 → 用 async,安全边际更大
  • 要放 URL 里 → 加util.Type.URL_SAFE
  • 解码一定要 try-catch
http://www.jsqmd.com/news/874681/

相关文章:

  • 2026年现阶段河北翻边优质厂商寻源指南:美腾管件制造有限公司实力解析 - 2026年企业推荐榜
  • 2026年成都叉车官网厂家地址核验及服务能力解析:叉车对比、四川叉车品牌推荐、四川叉车推荐、工业洗地机价格、工业洗地机哪个好选择指南 - 优质品牌商家
  • 2026年餐厨垃圾固液分离设备厂家TOP5客观盘点:油泥离心机/泥浆固液分离/淤泥固液分离/煤矿离心机/离心式固液分离/选择指南 - 优质品牌商家
  • Windows 10/11 下彻底搞定 TesseractNotFoundError:从下载安装到配置环境变量(含中文包)
  • 2026年5月西南区域汽车地磅厂家性价比评测报告:二手地磅/便携式地磅/工厂智能称重系统/数字地磅/无人值守地磅/选择指南 - 优质品牌商家
  • SSH主机密钥变更警告原理与安全处置指南
  • 2026机器人领域包塑金属软管优质推荐指南:金属软管接头/铠装隔爆电缆防水接头/镀锌金属软管/阻燃塑料波纹管/阻燃电缆防水接头/选择指南 - 优质品牌商家
  • 从零配置 ESLint 9 + React + TypeScript:踩坑与终极解决方案
  • 2026年杭州网店客服外包TOP5服务商客观实测排行:杭州视频号客服外包、杭州靠谱的客服外包团队、杭州京东客服外包选择指南 - 优质品牌商家
  • 市面上有哪些真正可以轻松降低AI生成疑似率,好用性价比高的降AIGC软件
  • ops-nn 仓库概览:神经网络基础算子的“地基工程“
  • Rust内存管理模式:从所有权到智能指针的完整指南
  • 模块化AI:从大脑启示到工程实践,构建高效智能系统的核心范式
  • 诺和新元在华两大重点项目在天津和太仓竣工启用 | 美通社头条
  • 告别“盲人摸象”:用Sentinel-1数据+SBAS-InSAR,5步搞定城市地面沉降监测(附Python代码片段)
  • 2026年质量好的家装设计装饰装修优选公司推荐 - 行业平台推荐
  • 手把手教你学Simulink——交流微电网中双向DC-AC变换器的多模式切换仿真
  • 2026金属楼梯定制优质厂家推荐榜:旋转楼梯定制、旋转楼梯源头工厂、耐高温不锈钢板批发、钢板旋转楼梯、304不锈钢板批发选择指南 - 优质品牌商家
  • 云服务器Nginx静态网站首屏慢的四层根因与优化方案
  • 保姆级教程:在Ubuntu 20.04上从源码编译安装SUMO 1.19.0(含环境变量配置避坑指南)
  • 2026年广东地区重点建设项目防水母线槽供应商深度解析 - 2026年企业推荐榜
  • 遥感因果分析:多尺度表征拼接技术解析与工程实践
  • VLM情境感知实验:90%功能描述漂移揭示智能体功能优先视觉架构
  • 2026年4月本地钢制家具厂家推荐,铁艺公寓床/宿舍公寓床/高低床/单人床/图书馆钢制家具,钢制家具源头工厂哪家好 - 品牌推荐师
  • 分离轴算法(SAT)的前置步骤:手把手教你用Python实现凹多边形切割
  • 线性化多噪声训练:提升混沌系统长期预测稳定性的正则化技术
  • JWT签名机制与常见攻击实战:从PortSwigger靶场12关学透算法混淆、密钥混淆与JWKS劫持
  • Rust异步编程实战:构建高性能并发应用
  • 边缘计算与多车协同如何提升自动驾驶目标检测
  • Ubuntu 22.04双网卡配置踩坑记:netplan apply报错‘默认路由冲突’的三种解法