5个版本
0.1.4 | 2021年5月17日 |
---|---|
0.1.3 | 2021年3月11日 |
0.1.2 | 2021年3月11日 |
0.1.1 | 2021年3月11日 |
0.1.0 | 2021年3月11日 |
#2108 in 编码
每月下载 257次
在basecracker中使用
21KB
203 行
bs62
一个支持前导零字节的 Base62 编码器/解码器。
通常,在将十进制(十进制)转换为 Base62 的过程中,输入数据被解释为一个大数字
[0x00, 0x13, 0x37] => 0x001337 => 4919 (十进制)
由于前导零不计入数字的值(001337 = 1337),在将数字转换为 Base62 时将被忽略。
- 这正是
encode_num
函数所执行的。 encode_data
会保留这些前导零。
这是通过在编码前向数据前添加一个 0x01
字节来实现的,从而创建一个以 1
开头的数字:001337 => 1001337
(不删除零)
在将数据从 Base62 解码回十进制后,会删除前导的 0x01
:1001337 => 001337
字母表
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
这是与CyberChef默认使用的相同字母表:[0-9][A-Z][a-z]
。
维基百科/Base62 建议使用另一种字母表([A-Z][a-z][0-9]
),但我在网上发现许多转换器使用的是以下两种之一:[0-9][A-Z][a-z]
或者 [0-9][a-z][A-Z]
。由于我喜欢 CyberChef,所以我决定也使用他们的默认字母表。我也认为从数字开始更自然,因为62进制实际上是一种类似于十进制(实际上是基10)或十六进制(基16)的数制。
示例
将数据转换为62进制
此方法将在编码数据之前将其前缀为 0x01
。
let data = vec![0x13, 0x37];
let encoded = bs62::encode_data(&data);
assert_eq!(encoded, "IKN")
解析62进制为数据
此方法在解码后期望字节数组中有一个前缀 0x01
。在返回字节数组之前,它会删除第一个字节。
let encoded = "IKN";
let data = bs62::decode_data(&encoded)?;
assert_eq!(data, vec![0x13_u8, 0x37]);
将数字转换为62进制
let num = 1337;
let encoded = bs62::encode_num(&num);
assert_eq!(encoded, "LZ")
解析62进制为数字
let num = 1337;
let encoded = bs62::encode_num(&num);
assert_eq!(encoded, "LZ")
许可证
bs62
根据 MIT 许可证。
有关更多信息,请参阅此存储库中的 LICENSE.txt 文件。
依赖关系
~495KB
~11K SLoC