Flutter for OpenHarmony:convert 高效的二进制编码解码器,轻松处理 Hex、JSON、Base64(数据格式转换) 深度解析与鸿蒙适配指南

Flutter for OpenHarmony:convert 高效的二进制编码解码器,轻松处理 Hex、JSON、Base64(数据格式转换) 深度解析与鸿蒙适配指南

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net

前言

在数据传输、加密解密、文件读写等底层操作中,二进制数据的转换是家常便饭。Flutter (Dart) 核心库虽然内置了 dart:convert (JSON/UTF8),但在处理十六进制 (Hex) 字符串、非常规 Base64 变体或其他编码时略显力不从心。

convert 是 Dart 官方维护的一个增强转换库,它提供了大量实用的 Codec, Converter, Sink 实现,填补了标准库在常见编码格式上的空白,尤其在处理自定义协议报文时极为便利。

一、概念介绍/原理解析

1.1 核心概念

  • Codec (编解码器): 包含 EncoderDecoder,如 hex 对象即为一个 Codec。
  • Converter (转换器): 单向转换,如 hex.decoder 将字符串转为字节列表。
  • Sink (数据槽):用于流式处理数据,适合大文件或网络流。

'48656c6c6f' (十六进制字符串)

hex.decode

72, 101, 108, 108, 111

hex.encode

1.2 进阶概念

该库遵循 dart:convert 的设计模式,这意味着它可以无缝集成到 Stream.transform 管道中。

二、核心 API/组件详解

2.1 基础用法

处理 Hex 字符串。

import'package:convert/convert.dart';voidmain(){// 1. Hex 编码 (Bytes -> String)var bytes =[0x48,0x65,0x6c,0x6c,0x6f];// "Hello"var hexString = hex.encode(bytes);print(hexString);// "48656c6c6f"// 2. Hex 解码 (String -> Bytes)var decoded = hex.decode('48656c6c6f');print(decoded);// [72, 101, 108, 108, 111]}

2.2 流式转换 (Stream)

处理大文件或网络流时,使用 transform 更加高效。

import'dart:async';import'package:convert/convert.dart';voidprocessStream(){// 模拟一个不断产生 Hex 字符串的流var stream =Stream.fromIterable(['48','65','6c','6c','6f']);// 转换为字节流 stream.transform(hex.decoder).listen((byte){print('收到字节: $byte');});}
在这里插入图片描述

2.3 AccumulatorSink

累积数据直到处理这一块的全部内容。这在处理分块传输(Chunked Transfer)时很有用。

var sink =AccumulatorSink<String>(); sink.add('Part 1'); sink.add('Part 2'); sink.close();print(sink.events);// ["Part 1", "Part 2"]

三、常见应用场景

3.1 场景 1:蓝牙/串口通信

低功耗蓝牙 (BLE) 设备传输的数通常是十六进制字节流,App 端需将其转为可读字符串或对象。

voidonBleDataReceived(List<int> data){// 假设前 2 字节是标志位String hexStr = hex.encode(data);print('Received raw hex: $hexStr');}

3.2 场景 2:加密密钥存储

AES/RSA 密钥通常以 Hex 或 Base64 形式存储在本地文件或数据库中。

voidsaveKey(List<int> keyBytes)async{// 转为 Hex 字符串存储,通过 secure_storagefinal keyHex = hex.encode(keyBytes);await storage.write(key:'aes_key', value: keyHex);}

3.3 场景 3:自定义协议解析

解析 Socket 接收到的定长包头(如前 4 字节为长度,后续为 JSON 体)。

voidparsePacket(List<int> packet){// 取前4字节的 HexString lenHex = hex.encode(packet.sublist(0,4)); int len = int.parse(lenHex, radix:16);// ...}

四、OpenHarmony 平台适配

4.1 纯算法库

convert 是纯 Dart 逻辑,无任何平台相关代码,在 OpenHarmony 上直接可用,无需配置。

4.2 性能优化

对于极大量数据的转换(如图片 Hex 转码),建议放入 compute (Isolate) 中执行,以免阻塞 UI 线程。

五、完整示例代码

本示例构建一个简单的 Hex 转换工具,用户输入字符串(如 “Hello”)或 Hex(如 “4865…”),实时显示另一种格式。

import'dart:convert';import'package:convert/convert.dart';// 是的,这里与 dart:convert 不冲突但需注意命名import'package:flutter/material.dart';voidmain(){runApp(constMaterialApp(home:ConverterPage()));}classConverterPageextendsStatefulWidget{constConverterPage({super.key});@overrideState<ConverterPage>createState()=>_ConverterPageState();}class _ConverterPageState extendsState<ConverterPage>{final _textController =TextEditingController();final _hexController =TextEditingController();String _error ='';void_onTextChanged(String text){try{// String -> UTF8 Bytes -> Hex Stringvar bytes = utf8.encode(text);var hexStr = hex.encode(bytes); _hexController.value =TextEditingValue( text: hexStr, selection:TextSelection.collapsed(offset: hexStr.length),);setState(()=> _error ='');}catch(e){// 一般不会错}}void_onHexChanged(String text){try{// 移除可能存在的空格var cleanHex = text.replaceAll(' ','');// Hex String -> Bytes -> UTF8 Stringvar bytes = hex.decode(cleanHex);var str = utf8.decode(bytes); _textController.value =TextEditingValue( text: str, selection:TextSelection.collapsed(offset: str.length),);setState(()=> _error ='');}catch(e){setState(()=> _error ='无效的 Hex 格式');}}@overrideWidgetbuild(BuildContext context){returnScaffold( appBar:AppBar(title:constText('Hex 转换工具')), body:Padding( padding:constEdgeInsets.all(16.0), child:Column( children:[TextField( controller: _textController, decoration:constInputDecoration( labelText:'普通文本 (UTF-8)', border:OutlineInputBorder(),), onChanged: _onTextChanged,),constSizedBox(height:20),constIcon(Icons.swap_vert, size:32, color:Colors.blue),constSizedBox(height:20),TextField( controller: _hexController, decoration:InputDecoration( labelText:'十六进制 (Hex)', border:constOutlineInputBorder(), errorText: _error.isNotEmpty ? _error :null,), onChanged: _onHexChanged, keyboardType:TextInputType.text,// Hex contains a-f),],),),);}}
在这里插入图片描述

六、总结

convert 库极其轻量,却解决了 Dart 标准库在这方面的缺失。

最佳实践

  1. 异常捕获:Hex 解码极易出错(比如长度是奇数),务必 try-catch
  2. 区分大小写:通常 Hex 库能处理大小写,但规范输出时建议统一(如大写)。
  3. 流处理:处理文件流时优先使用 Stream.transform(hex.decoder),而非一次性读取内存。

Read more

医疗AI场景下算法编程的深度解析(2026新生培训讲稿)(四)

医疗AI场景下算法编程的深度解析(2026新生培训讲稿)(四)

第7章 k-均值算法:患者分群与精准医疗 在医疗领域,我们常常面临这样的问题:患者是否可以划分为不同的亚型?不同亚型是否有不同的疾病进展模式或治疗反应?这些问题属于无监督学习的范畴。k-均值(k-means)聚类算法是最经典、最常用的无监督学习算法之一,它能够将数据划分为 k 个簇,使得同一簇内的样本高度相似,不同簇间的样本差异显著。本章将从算法原理出发,深入解析 k-均值在医疗场景中的应用,并通过实战案例展示如何利用 k-均值发现慢性病患者的潜在亚型,为精准医疗提供依据。 7.1 算法原理 7.1.1 聚类问题概述 聚类是一种无监督学习任务,目标是将数据集中的样本划分为若干个组(簇),使得同一组内的样本尽可能相似,不同组间的样本尽可能不同。与分类不同,聚类不依赖于预先标记的类别,而是从数据本身发现结构。 7.1.2 k-均值算法的核心思想 k-均值算法试图将 n 个样本划分到 k 个簇中,使得每个样本到其所属簇中心的距离平方和最小。簇中心是簇内所有样本的均值(因此得名“

By Ne0inhk
从0到1打造专业职配助手:基于openJiuwen记忆库新特性的AI职业规划实战

从0到1打造专业职配助手:基于openJiuwen记忆库新特性的AI职业规划实战

前言 最近基于openJiuwen框架,用它最新推出的独立记忆库功能,搭建了一个“专业职配助手”智能体。它不仅能依托行业知识库给出专业-岗位匹配建议,更能通过记忆库记住用户的专业背景、职业偏好,实现跨智能体的个性化推荐。今天就把从模型配置到智能体测试的全流程拆解给你,重点聊聊记忆库如何让AI真正“懂你”。 一、核心思路:知识库+记忆库,让AI从“会回答”到“懂你” 这次搭建的核心,是openJiuwen的记忆库新特性: * 知识库:作为“公共知识底座”,存储全行业职业数据、专业与岗位对应表,解决“专业能做什么”的问题; * 记忆库:作为“用户专属档案”,存储用户的专业背景、职业偏好、咨询历史,解决“你适合做什么”的问题; * 大模型:负责理解用户需求,同时调用知识库和记忆库,生成精准、个性化的职业建议。 一句话概括:用知识库提供行业广度,用记忆库赋予用户温度,让这两者的结合更高效、更灵活。

By Ne0inhk

AI 技能(Skills):一种面向任务自动化的模块化执行范式

AI 技能(Skills):一种面向任务自动化的模块化执行范式 摘要:Skills 并非新概念,而是对提示工程(Prompt Engineering)与工具调用(Tool Use)的系统性封装。它通过元数据、行动指南与可执行资源的三元结构,将大模型能力从“文本生成”延伸至“闭环操作”。 一、本质定义 * Skills 是一种轻量级、可复用的任务执行单元,用于赋予大模型确定性行为能力。 * 其核心目标是解决传统提示词的三大局限: * 不可复用:每次需重复编写相似指令; * 无状态:无法跨会话保持上下文策略; * 无执行:仅输出文本,无法触发真实动作(如绘图、文件处理、API 调用)。 类比理解:Skills ≈ 函数(Function) 输入:自然语言指令; 输出:结构化结果 + 副作用(如生成图像、修改文件、发送请求)

By Ne0inhk
『告别手工测试:AI 自动化测试覆盖 90% 场景的秘诀』

『告别手工测试:AI 自动化测试覆盖 90% 场景的秘诀』

在 AI 技术飞速渗透各行各业的当下,我们早已告别 “谈 AI 色变” 的观望阶段,迈入 “用 AI 提效” 的实战时代 💡。无论是代码编写时的智能辅助 💻、数据处理中的自动化流程 📊,还是行业场景里的精准解决方案 ,AI 正以润物细无声的方式,重构着我们的工作逻辑与行业生态 🌱。今天,我想结合自身实战经验,带你深入探索 AI 技术如何打破传统工作壁垒 🧱,让 AI 真正从 “概念” 变为 “实用工具” ,为你的工作与行业发展注入新动能 ✨。 文章目录 * 告别手工测试:AI 自动化测试覆盖 90% 场景的秘诀 🤖🧪 * 一、引言:从手工到AI,测试革命的浪潮 🌊🌊 * 1. 传统手工测试的困境 ⚠️ * 2. 自动化测试的初步尝试 🤖 * 3. AI驱动自动化测试的崛起 🌟🤖 * 二、AI自动化测试的关键技术栈 🧠⚙️ * 1.

By Ne0inhk