哈吉米64 (Hachi64) - Dart 实现
Dart 实现的哈吉米64编解码器,使用64个中文字符进行 Base64 风格的编码和解码。适用于 Flutter 和 Dart Web 应用。
功能特性
- 使用64个中文字符(哈吉米字符集)进行编码
- 完全可逆的编码解码过程
- 支持带填充和不带填充的编码模式
- 兼容标准 Base64 的编码原理
- 多平台支持: Flutter (iOS/Android), Web, Desktop
- 零依赖(除了开发测试依赖)
快速开始
环境要求
- Dart SDK 2.12.0 或更高版本
- 对于 Flutter 项目: Flutter SDK 2.0.0 或更高版本
安装
在你的 pubspec.yaml 文件中添加依赖:
dependencies:
hachi64:
path: ../dart # 如果使用本地路径
或者从 pub.dev 安装(待发布):
dependencies:
hachi64: ^1.0.0
然后运行:
dart pub get
# 或者在 Flutter 项目中
flutter pub get
构建和测试
# 获取依赖
dart pub get
# 运行测试
dart test
# 运行测试并显示详细输出
dart test --reporter expanded
使用方法
基本用法
import 'dart:typed_data';
import 'dart:convert';
import 'package:hachi64/hachi64.dart';
void main() {
// 编码
final data = utf8.encode('Hello, World!');
final encoded = Hachi64.encode(Uint8List.fromList(data));
print('编码结果: $encoded');
// 输出: 豆米啊拢嘎米多拢迷集伽漫咖苦播库迷律==
// 解码
final decoded = Hachi64.decode(encoded);
final original = utf8.decode(decoded);
print('解码结果: $original');
// 输出: Hello, World!
}
不带填充的编码
import 'dart:typed_data';
import 'dart:convert';
import 'package:hachi64/hachi64.dart';
void main() {
final data = utf8.encode('Hello');
// 编码时不使用 '=' 填充
final encodedNoPad = Hachi64.encode(
Uint8List.fromList(data),
padding: false
);
print(encodedNoPad); // 输出: 豆米啊拢嘎米多
// 解码时指定无填充
final decoded = Hachi64.decode(encodedNoPad, padding: false);
print(utf8.decode(decoded)); // 输出: Hello
}
在 Flutter 中使用
import 'package:flutter/material.dart';
import 'package:hachi64/hachi64.dart';
import 'dart:typed_data';
import 'dart:convert';
class Hachi64Demo extends StatelessWidget {
@override
Widget build(BuildContext context) {
final data = utf8.encode('Flutter is awesome!');
final encoded = Hachi64.encode(Uint8List.fromList(data));
final decoded = Hachi64.decode(encoded);
return Column(
children: [
Text('原始文本: Flutter is awesome!'),
Text('编码结果: $encoded'),
Text('解码结果: ${utf8.decode(decoded)}'),
],
);
}
}
API 文档
Hachi64 类
静态方法
encode(Uint8List data, {bool padding = true}) → String
将字节数组编码为哈吉米64字符串。
参数:
data: 要编码的字节数组 (Uint8List)padding: 是否使用=进行填充(默认为true)
返回:
- 编码后的字符串
示例:
final bytes = Uint8List.fromList([72, 101, 108, 108, 111]);
final encoded = Hachi64.encode(bytes);
print(encoded); // 豆米啊拢嘎米多=
decode(String encodedStr, {bool padding = true}) → Uint8List
将哈吉米64字符串解码为字节数组。
参数:
encodedStr: 要解码的字符串padding: 输入字符串是否使用=进行填充(应与编码时的设置一致,默认为true)
返回:
- 解码后的字节数组 (Uint8List)
异常:
FormatException: 如果输入包含无效字符
示例:
final decoded = Hachi64.decode('豆米啊拢嘎米多=');
print(String.fromCharCodes(decoded)); // Hello
常量
hachiAlphabet
哈吉米64字符集常量,包含64个中文字符。
const String hachiAlphabet = "哈蛤呵吉急集米咪迷南男难北背杯绿律虑豆斗抖啊阿额西希息嘎咖伽花华哗压鸭呀库酷苦奶乃耐龙隆拢曼慢漫波播玻叮丁订咚东冬囊路陆多都弥济";
字符集说明
哈吉米64使用以下64个中文字符:
哈蛤呵吉急集米咪迷南男难北背杯绿律虑豆斗抖啊阿额西希息嘎咖伽花华哗压鸭呀库酷苦奶乃耐龙隆拢曼慢漫波播玻叮丁订咚东冬囊路陆多都弥济
这些字符按发音相似性分组,使编码结果具有良好的视觉和听觉和谐性。主要音组包括:
- 哈音组(3个): 哈、蛤、呵
- 吉音组(6个): 吉、急、集、都、弥、济
- 米音组(3个): 米、咪、迷
- 南音组(6个): 南、男、难、囊、路、陆
- 北音组(3个): 北、背、杯
- 绿音组(3个): 绿、律、虑
- 豆音组(4个): 豆、斗、抖、多
- 啊音组(3个): 啊、阿、额
- 西音组(3个): 西、希、息
- 嘎音组(3个): 嘎、咖、伽
- 花音组(3个): 花、华、哗
- 压音组(3个): 压、鸭、呀
- 库音组(3个): 库、酷、苦
- 奶音组(3个): 奶、乃、耐
- 龙音组(3个): 龙、隆、拢
- 曼音组(3个): 曼、慢、漫
- 波音组(3个): 波、播、玻
- 叮音组(3个): 叮、丁、订
- 咚音组(3个): 咚、东、冬
编码示例
| 原始数据 | 编码结果 |
|---|---|
Hello |
豆米啊拢嘎米多= |
abc |
西阿南呀 |
Python |
抖咪酷丁息米都慢 |
Hello, World! |
豆米啊拢嘎米多拢迷集伽漫咖苦播库迷律== |
Base64 |
律苦集叮希斗西丁 |
Hachi64 |
豆米集呀息米库咚背哈== |
项目结构
dart/
├── lib/
│ └── hachi64.dart # 主实现文件
├── test/
│ └── hachi64_test.dart # 单元测试
├── pubspec.yaml # 包配置文件
└── README.md # 本文档
测试
本实现包含全面的单元测试,覆盖以下场景:
- ✅ 编码解码一致性测试
- ✅ 特定编码结果验证
- ✅ 二进制数据处理
- ✅ 有/无填充模式
- ✅ 错误处理
- ✅ 字母表验证
- ✅ 边界情况测试
运行测试:
dart test
查看测试覆盖率:
dart test --coverage=coverage
dart pub global activate coverage
dart pub global run coverage:format_coverage --lcov --in=coverage --out=coverage.lcov --report-on=lib
性能
Hachi64 Dart 实现针对性能进行了优化:
- 使用
StringBuffer进行高效字符串构建 - 预先构建反向映射表以加速解码
- 优化的位运算处理
- 最小化内存分配
多平台兼容性
本实现支持以下平台:
- ✅ Dart VM - 命令行应用
- ✅ Flutter iOS - iOS 应用
- ✅ Flutter Android - Android 应用
- ✅ Flutter Web - Web 应用
- ✅ Flutter Desktop - Windows/macOS/Linux 桌面应用
开发说明
添加新的测试
在 test/hachi64_test.dart 中添加新的测试用例。使用 group() 组织相关测试。
代码风格
本项目遵循 Dart 官方代码风格指南。使用 dart format 格式化代码:
dart format lib test
静态分析
运行静态分析检查代码质量:
dart analyze
注意事项
重要提示: 使用哈吉米字母表会使您编码的数据与标准 Base64 解码器不兼容。仅在您完全控制编码和解码过程时才使用此功能。
常见问题
Q: 为什么编码结果全是中文?
A: 这正是哈吉米64的特色!它使用64个精心挑选的中文字符代替标准 Base64 的字符集,使编码结果看起来像是有意义的中文文本。
Q: 可以和标准 Base64 互相转换吗?
A: 不能直接转换。哈吉米64使用的是自定义字符集,与标准 Base64 不兼容。
Q: 性能如何?
A: Dart 实现经过优化,在编码和解码性能上与标准 Base64 相当。
Q: 可以在 Flutter Web 中使用吗?
A: 可以!本实现完全支持 Flutter Web。
许可证
与主项目保持一致。
相关链接
Hachi64 - Dart Implementation
A Dart implementation of the Hachi64 encoder/decoder, using 64 Chinese characters for Base64-style encoding. Perfect for Flutter and Dart Web applications.
Features
- Encodes using 64 Chinese characters (Hachi alphabet)
- Fully reversible encoding/decoding process
- Supports both padded and unpadded encoding modes
- Compatible with standard Base64 encoding principles
- Multi-platform support: Flutter (iOS/Android), Web, Desktop
- Zero runtime dependencies
Quick Start
Requirements
- Dart SDK 2.12.0 or higher
- For Flutter projects: Flutter SDK 2.0.0 or higher
Installation
Add the dependency to your pubspec.yaml:
dependencies:
hachi64:
path: ../dart # if using local path
Then run:
dart pub get
# or in Flutter projects
flutter pub get
Build and Test
# Get dependencies
dart pub get
# Run tests
dart test
# Run tests with verbose output
dart test --reporter expanded
Usage
Basic Usage
import 'dart:typed_data';
import 'dart:convert';
import 'package:hachi64/hachi64.dart';
void main() {
// Encode
final data = utf8.encode('Hello, World!');
final encoded = Hachi64.encode(Uint8List.fromList(data));
print('Encoded: $encoded');
// Output: 豆米啊拢嘎米多拢迷集伽漫咖苦播库迷律==
// Decode
final decoded = Hachi64.decode(encoded);
final original = utf8.decode(decoded);
print('Decoded: $original');
// Output: Hello, World!
}
Encoding without Padding
import 'dart:typed_data';
import 'dart:convert';
import 'package:hachi64/hachi64.dart';
void main() {
final data = utf8.encode('Hello');
// Encode without '=' padding
final encodedNoPad = Hachi64.encode(
Uint8List.fromList(data),
padding: false
);
print(encodedNoPad); // Output: 豆米啊拢嘎米多
// Decode without padding
final decoded = Hachi64.decode(encodedNoPad, padding: false);
print(utf8.decode(decoded)); // Output: Hello
}
License
Consistent with the main project.
Contributing
See the main project repository for contribution guidelines.
Libraries
- hachi64
- 哈吉米64 编解码器 - 使用64个中文字符进行 Base64 风格的编码和解码