news 2026/9/25 2:36:31

hibase32-cj API完整参考:6个核心函数的参数、返回值与用法示例速查

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
hibase32-cj API完整参考:6个核心函数的参数、返回值与用法示例速查

hibase32-cj API完整参考:6个核心函数的参数、返回值与用法示例速查

【免费下载链接】hibase32-cjBase32(RFC 4648)编码/解码库项目地址: https://gitcode.com/Cangjie-TPC/hibase32-cj

hibase32-cj是一个使用仓颉语言实现的Base32(RFC 4648)编码/解码库,支持 UTF-8 中文文本与原始字节的互转。本文是一份完整的 API 速查指南:逐一讲解 6 个核心函数的参数、返回值与用法示例,帮你在 5 分钟内掌握全部接口,避免踩坑。

为什么选择 hibase32-cj?

Base32 编码把任意二进制数据映射为A-Z和2-7共 31 个安全字符,天然不区分大小写歧义(字符表不含0/O/1/I),常用于 Token、验证码、文件名编码等场景。hibase32-cj 的优势:

  • ⚡纯仓颉实现:无外部 JS 依赖,encodeBytes与unsignedRightShift均为自行实现
  • 🈶UTF-8 友好:中文、emoji、生僻字(如𠜎)均可正确编解码
  • 🧪测试充分:配套 base32_test.cj 覆盖 ASCII、UTF-8、数组、异常等场景

项目结构非常简单,核心逻辑全部在 src/base32.cj 一个文件里:

src/ ├── base32.cj # 核心代码(全部 6 个核心函数都在这里) └── test/ └── base32_test.cj # 单元测试

6个核心函数一览表

函数参数返回值一句话用途
encode(input: String)待编码的字符串String字符串 → Base32
encode(input: Array<UInt8>)待编码的字节数组String字节数组 → Base32
decodeAsString(base32Str)Base32 字符串StringBase32 → UTF-8 字符串
decodeAsBytes(base32Str)Base32 字符串Array<UInt8>Base32 → 字节数组
unsignedRightShift(value, shift)被移位值、移位位数Int6432 位无符号右移(>>>)
testVaildBase32(str)待校验字符串Bool校验是否为合法 Base32 字符

💡 记忆技巧:encode 管编码、decode 管解码、unsignedRightShift 是底层位运算、testVaildBase32 是输入校验,四个角色各司其职。

encode(String):字符串编码函数怎么调用?

源码位置:src/base32.cj#L17-L19

public func encode(input: String): String
  • 参数:input— 任意 UTF-8 字符串(中文、英文、emoji 均可)
  • 返回值:标准 Base32 编码字符串,末尾按需补齐=
  • 内部流程:字符串先通过toArray()转为字节序列,再交给私有的 encodeBytes 完成位运算

用法示例(摘自 README.md 功能示例):

encode("Hello") // JBSWY3DP encode("中文") // 4S4K3ZUWQ4====== encode("𠜎") // 6CQJZDQ=

encode(Array ):字节数组编码函数参数说明

源码位置:src/base32.cj#L13-L15

public func encode(input: Array<UInt8>): String

与字符串版本同名的重载函数,适合处理二进制数据(文件内容、Buffer 等)。

  • 参数:input—UInt8字节数组
  • 返回值:Base32 字符串

用法示例(与 base32_test.cj#L84-L88 中testUint8Arryay用例一致):

var arr = ArrayList<UInt8>([72, 101, 108, 108, 111]).toArray() encode(arr) // JBSWY3DP

✅ 字节[72, 101, 108, 108, 111]正是"Hello"的 ASCII 值,两种入参编码结果完全一致。

decodeAsString:Base32解码为字符串的完整用法

源码位置:src/base32.cj#L21-L23

public func decodeAsString(base32Str: String): String
  • 参数:base32Str— 标准 Base32 字符串(允许末尾=填充)
  • 返回值:按 UTF-8 还原后的字符串
  • 实现原理:内部先调用decodeAsBytes得到字节数组,再由String.fromUtf8还原为文本

用法示例(对应 base32_test.cj#L104-L112 的testUtf8Decode):

decodeAsString("JBSQ====") // He decodeAsString("4S4K3ZUWQ4======") // 中文 decodeAsString("6CQJZDQ=") // 𠜎

⚠️ 两个常见异常:

  1. 输入含非法字符(小写字母、0/1/8/9、空格等)→ 抛出Exception("Invalid base32 characters")
  2. 解码出的字节不是合法 UTF-8 → 抛出OverflowException,例如解码7A======(字节 0x7A 无法独立构成 UTF-8)

下图就是一个真实的解码异常堆栈,指向 base32.cj 的decode调用链:

decodeAsBytes:解码为字节数组的参数与返回值

源码位置:src/base32.cj#L25-L125

public func decodeAsBytes(base32Str: String): Array<UInt8>
  • 参数:base32Str— Base32 字符串
  • 返回值:Array<UInt8>字节数组
  • 边界行为:
    • 空字符串 → 返回空数组(不抛异常)
    • 非法字符 → 抛出Exception
    • 解码采用「8 字符一组」批量处理 + 剩余 2/4/5/7 字符的余数分支,保证填充=被正确处理

如果你要的是"解码成可打印文本",直接用decodeAsString;需要操作原始二进制(写文件、协议组包)时才用decodeAsBytes。

unsignedRightShift:仓颉版无符号右移怎么用?

源码位置:src/base32.cj#L206-L216

public func unsignedRightShift(value: Int64, shift: Int64): Int64

这是本库对 JavaScript>>>运算符的等价实现,也是 Base32 位拼接的底层基石:

  • 参数:value— 被移位值;shift— 右移位数
  • 返回值:32 位无符号右移结果
  • 细节:移位位数会先对 32 取模,shift % 32 == 0时直接返回原值

用法示例(摘自 base32_test.cj#L129-L158 的testUnsignedRightShift):

unsignedRightShift(2, 1) // 1 unsignedRightShift(-2, 1) // 2147483647(负数按无符号处理) unsignedRightShift(2, 32) // 2(移位位数大于32时自动取模)

💡 一般业务代码很少直接调用它,但理解它有助于你看懂 encodeBytes 里每 5 字节拼出 8 个字符的位运算。

testVaildBase32:如何快速校验Base32字符串合法性?

源码位置:src/base32.cj#L218-L228

public func testVaildBase32(str: String): Bool
  • 参数:str— 待校验字符串
  • 返回值:true表示每个字符都在ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=白名单内
  • 典型用途:在调用解码前先做"前置体检",给用户更友好的错误提示

用法示例(摘自 base32_test.cj#L160-L172 的testVaildBase32):

testVaildBase32("A2B3C4D5") // true testVaildBase32("abcdefgh") // false(小写不合法) testVaildBase32("ABCD*EFG") // false(含非法字符 *)

Base32 字符表速记:A-Z映射 0–25,2-7映射 26–31(定义见 BASE32_DECODE_CHAR),注意0、1、8、9 是刻意缺席的。

解码原理中的 Rune 类型是什么?

decodeAsBytes内部把输入转成 Rune 数组遍历(base32.cj#L34 的toRuneArray())。Rune 是仓颉中表示 Unicode 字符的类型,覆盖\u{0000}–\u{D7FF}与\u{E000}–\u{10FFF}:

正因为按 Rune(而非字节)遍历,中文等多字节字符才能被正确识别。

如何编译运行与验证测试?

在项目根目录执行即可(配置见 cjpm.toml,当前要求 cjc 0.53.4+):

cjpm build # 编译构建(Win/Linux/Mac 通用)

想自己验证接口行为,运行单元测试即可覆盖 ASCII、UTF-8、数组、异常全部用例:

cjpm test

常见问题速答(FAQ)

Q1:编码结果末尾的=是错误吗?不是。=是 RFC 4648 的标准填充,长度取决于输入字节数 mod 5,解码时会被自动忽略。

Q2:为什么小写字母不能解码?RFC 4648 标准字符表只含大写字母与2-7,testVaildBase32 对abcdefgh会返回false,请自行做大小写转换后再解码。

Q3:空字符串能编解码吗?可以。encode("")返回空字符串,decodeAsBytes("")返回空数组,均不会抛异常。

Q4:解码到非法 UTF-8 会怎样?decodeAsString会抛出OverflowException。若不确定输出是否为文本,建议先用decodeAsBytes拿到字节再自行处理。

总结

hibase32-cj 以极小的 API 面提供了完整的 Base32 能力:两个encode重载负责编码,两个decode变体负责解码,unsignedRightShift与testVaildBase32分别是位运算与校验的基石。配合 src/test/base32_test.cj 的完整用例,你可以放心地在仓颉项目中用它处理 Token、验证码、文件编码等一切 Base32 场景。

【免费下载链接】hibase32-cjBase32(RFC 4648)编码/解码库项目地址: https://gitcode.com/Cangjie-TPC/hibase32-cj

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

一条报文在CanIf模块中都经历了什么

写在前面&#xff1a; 入行一段时间了&#xff0c;基于个人理解整理一些东西&#xff0c;如有错误&#xff0c;欢迎各位大佬评论区指正&#xff01;&#xff01;&#xff01;CanIf 模块是 AUTOSAR 基础软件&#xff08;BSW&#xff09;的一部分&#xff0c;位于 CAN 驱动程序&a…

作者头像 李华
网站建设 2026/9/25 2:36:04

招聘系统权限管理实战:RBAC模型与Spring Security JWT落地

企业招聘系统的权限管理&#xff0c;看着是个老生常谈的话题&#xff0c;但真到自己从零搭建一套&#xff0c;才发现坑远比想象的多。尤其招聘系统这种角色多、数据敏感的业务——HR、部门主管、面试官、求职者、管理员&#xff0c;每个角色能看什么、能改什么、能审批什么&…

作者头像 李华
网站建设 2026/9/25 2:36:03

微信小程序汉字笔顺动画组件:Canvas渲染与避坑指南

简介&#xff1a;这是一份面向微信小程序开发者的 Hanzi Writer 组件源码包&#xff0c;用于在小程序内快速集成汉字书写器&#xff0c;实现笔画顺序动画、写法演示与问答交互等教学功能。组件原仓库虽已停止维护&#xff0c;但作者提供了 npm 的 beta 安装方式&#xff0c;适合…

作者头像 李华