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

Base64工具库:编码与解码工具类(239)

在鸿蒙(HarmonyOS)应用开发中,Base64 编码与解码是处理二进制数据与文本协议转换的基石,广泛应用于 Token 传输、图片转字符串、文件加密等场景。

鸿蒙官方提供了底层且高性能的buffer模块,同时社区也封装了更为便捷的Base64Util工具类

一、 官方原生方案:Buffer 模块实战

场景:在不引入第三方库的情况下,利用鸿蒙原生的@kit.ArkTS中的buffer模块,实现字符串与 Base64 之间的双向转换。

import { buffer } from '@kit.ArkTS'; // 1. 字符串编码为 Base64 const plainText = 'Hello HarmonyOS'; const base64Str = buffer.from(plainText, 'utf-8').toString('base64'); console.info('编码结果:', base64Str); // 输出: SGVsbG8gSGFybW9ueU9T // 2. Base64 解码还原为字符串 const decodedText = buffer.from(base64Str, 'base64').toString('utf-8'); console.info('解码结果:', decodedText); // 输出: Hello HarmonyOS // 3. 处理二进制文件(如图片)的 Base64 转换 const imageArray = new Uint8Array([0x89, 0x50, 0x4E, 0x47]); // 模拟图片字节 const imageBase64 = buffer.from(imageArray).toString('base64');

二、 社区进阶方案:Base64Util 工具类

场景:在大型项目中,将 Base64 的转换逻辑、异常捕获和 URL 安全处理封装为全局单例工具类,提升代码复用率。

import { buffer } from '@kit.ArkTS'; export class Base64Util { // 1. 标准 Base64 编码 static encode(input: string | Uint8Array): string { try { if (typeof input === 'string') { return buffer.from(input, 'utf-8').toString('base64'); } return buffer.from(input).toString('base64'); } catch (err) { console.error('Base64 编码失败:', err); return ''; } } // 2. 标准 Base64 解码 static decode(base64Str: string): string { try { return buffer.from(base64Str, 'base64').toString('utf-8'); } catch (err) { console.error('Base64 解码失败:', err); return ''; } } // 3. URL 安全的 Base64 编码(将 + 替换为 -,/ 替换为 _,去掉 =) static encodeUrlSafe(input: string): string { return Base64Util.encode(input).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, ''); } }

三、 高阶实战:大文件流式 Base64 转换

场景:当需要处理几 MB 甚至更大的文件(如视频、高清图片)时,直接将其全部转为 Base64 会导致内存溢出(OOM)。必须采用分片读取与转换策略。

import { fileIo as fs } from '@kit.CoreFileKit'; import { Base64Util } from './Base64Util'; async function largeFileToBase64(filePath: string): Promise<string> { const file = fs.openSync(filePath, fs.OpenMode.READ_ONLY); const chunkSize = 3 * 1024; // 每次读取 3KB(3的倍数,避免 Base64 截断错位) const bufferArray = new Uint8Array(chunkSize); let base64Result = ''; let readLen = 0; while ((readLen = fs.readSync(file.fd, bufferArray)) > 0) { const chunk = bufferArray.subarray(0, readLen); base64Result += Base64Util.encode(chunk); } fs.closeSync(file); return base64Result; }
  1. 内存膨胀预警:Base64 编码会使数据体积增加约33%。在处理大文件时,严禁在主线程一次性转换,必须结合TaskPool分片处理,防止引发应用崩溃。
  2. URL 传参陷阱:标准的 Base64 包含+/字符,在作为 URL 参数传递时会被浏览器或服务器错误转义。涉及网络传输时,务必使用 URL 安全的 Base64 变体(URL-Safe Base64)。
  3. 去除 BOM 头:在解码由其他系统生成的 Base64 字符串时,可能会遇到隐藏的 BOM 头导致解码乱码。建议在解码前执行base64Str.trim()清理首尾空白字符。
  4. 图片预览规范:如果将 Base64 字符串直接赋值给鸿蒙Image组件的src属性,必须加上数据 URI 前缀,例如:data:image/png;base64,${base64Str},否则图片将无法渲染。

四、 官方 Base64Helper :完整的编码与解码管道

场景:使用鸿蒙官方推荐的util.Base64Helper结合TextEncoder/TextDecoder,构建标准的字符串与 Base64 互转管道,彻底解决中文乱码问题。

import { util } from '@kit.ArkTS'; export class Base64Pipe { // 字符串 -> Base64 static encode(input: string): string { let encoder = new util.TextEncoder('utf-8'); let uint8Array = encoder.encodeInto(input); let helper = new util.Base64Helper(); return helper.encodeToStringSync(uint8Array); } // Base64 -> 字符串 static decode(input: string): string { let helper = new util.Base64Helper(); let uint8Array = helper.decodeSync(input); let decoder = util.TextDecoder.create('utf-8'); // 注意:使用静态工厂方法 return decoder.decodeToString(uint8Array); } }

五、高阶封装:支持同步/异步与 Uint8Array 转换

场景:在复杂业务中,既需要处理文本,也需要处理二进制文件(Uint8Array),同时需要异步方法避免阻塞主线程。

import { util } from '@kit.ArkTS'; export class Base64Util { private static createHelper(): util.Base64Helper { return new util.Base64Helper(); } // 二进制编码为 Base64 字符串(同步) static encodeToStrSync(array: Uint8Array): string { return Base64Util.createHelper().encodeToStringSync(array); } // Base64 解码为二进制(异步) static async decode(input: string): Promise<Uint8Array> { return Base64Util.createHelper().decode(input); } }

六、图片与 PixelMap :Base64 与图像互转

场景:将相册选中的图片转为 Base64 字符串用于上传,或将网络返回的 Base64 字符串还原为 PixelMap 进行 UI 展示。

import { image, util } from '@kit.ArkTS'; // 将图片二进制数据转为 Base64 function pixelMapToBase64(pixelMap: image.PixelMap): string { let num = pixelMap.getPixelBytesNumber(); let readBuffer = new ArrayBuffer(num); pixelMap.readPixelsToBufferSync(readBuffer); let helper = new util.Base64Helper(); return helper.encodeToStringSync(new Uint8Array(readBuffer)); } // 将 Base64 还原为 PixelMap function base64ToPixelMap(base64Str: string, width: number, height: number): image.PixelMap { let helper = new util.Base64Helper(); let imageUint8 = helper.decodeSync(base64Str).buffer; let opts: image.InitializationOptions = { editable: true, size: { height: height, width: width } }; return image.createPixelMapSync(imageUint8, opts); }
http://www.jsqmd.com/news/1242508/

相关文章:

  • 深入解析TI C2000 DSP的CLB_XBAR_REGS寄存器:信号路由配置实战
  • 2026年机电一体化专业怎么报名?成考高起专在哪考试?学费一年多少钱? - 我叫小周
  • C2000 CLB硬件可编程逻辑:从FPGA思维到实时控制实战
  • 深入解析嵌入式SoC电源与休眠控制器PSC:低功耗设计核心
  • 电商账务别等年底才补,拉萨市柳梧新区电商企业财税服务公司推荐 - 子柔传媒
  • 2026西安包包回收防坑指南 揭秘隐形收费套路 教你安心高价变现 - 日常财经早知道
  • 从国标 GB3847 解读 NHT-6 不透光度计的检测原理与落地运维要点
  • Python 高手编程系列三千四百零七:装饰器
  • 【AI视频演示ROI翻倍实战手册】:实测提升平均停留时长317%,附Figma+Runway双平台操作速查表
  • Kimi K3 2.8万亿参数登顶全球代码榜——MoE第四极来了
  • 2026 沈阳四家一站式奢侈品回收门店横评:报价、服务、时效全面对比 - 融媒生活
  • 被退稿后才懂:AI查重辅助不是“一键降重”,而是构建个人学术指纹系统(含GitHub开源工具链v2.3.1)
  • Tack未来展望:项目路线图与社区贡献指南
  • WSL Containers(wslc)完整安装与使用复盘手册
  • 河北瀛冀律师事务所卢雯团队郑重声明 - 起跑123
  • TI处理器MPU内存保护单元:原理、配置与嵌入式系统实战
  • 2026 国内料箱智能仓储厂商全景盘点:穿梭车、多穿车、高密集库核心玩家梳理
  • 2026 北京海淀区名包回收找易奢福好不好?门店集中各大商圈,就近回收省时省力 - 奢侈品回收实体店
  • 0 基础入门React Native鸿蒙跨平台开发:useWindowDimensions会在屏幕尺寸变化时自动更新获取到的设备width和height值
  • 2026年7月最新欧米茄宁波江北宝龙广场维修保养服务电话 - 欧米茄官方服务中心
  • TMS320F2837xS HRPWM高分辨率脉宽调制技术详解与工程实践
  • TI C2000 McBSP配置实战:SRG时钟与发送器全流程解析
  • 工业无线传感器网络标准
  • 2026成都奢表回收优质门店汇总,支持到店鉴定,拒绝隐形扣费 - 逸程奢侈品回收中心
  • 深入解析USB控制器中断与模式寄存器配置:从原理到实战
  • 2026 年 AI 标书工具选型全攻略:6 款主流平台实测对比,附避坑指南与场景匹配表
  • 新手必看:performance-optimization项目中的性能测试基础与实施步骤
  • 苏州回收古法黄金会不会扣损耗,焊点收费合理吗 - 生活时报
  • 苏仙区黄金回收哪家靠谱?2026 正规门店榜单出炉 - 黄金珠宝
  • 从FancyZones到MacsyZones:Windows用户迁移指南