常用编码格式
Base64
- Base64编码表, 记为\(\mathbb{E}\):
const BASE64_STD: [u8; 64] = [
b'A', b'B', b'C', b'D', b'E', b'F', b'G', b'H', b'I', b'J', b'K', b'L', b'M', b'N', b'O', b'P', b'Q', b'R', b'S', b'T', b'U', b'V', b'W', b'X', b'Y', b'Z', b'a', b'b', b'c', b'd', b'e', b'f', b'g', b'h', b'i', b'j', b'k', b'l', b'm', b'n', b'o', b'p', b'q', b'r', b's', b't', b'u', b'v', b'w', b'x', b'y', b'z', b'0', b'1', b'2', b'3', b'4', b'5', b'6', b'7', b'8', b'9', b'+', b'/',
];
const BASE64_URL: [u8; 64] = [
b'A', b'B', b'C', b'D', b'E', b'F', b'G', b'H', b'I', b'J', b'K', b'L', b'M', b'N', b'O', b'P', b'Q', b'R', b'S', b'T', b'U', b'V', b'W', b'X', b'Y', b'Z', b'a', b'b', b'c', b'd', b'e', b'f', b'g', b'h', b'i', b'j', b'k', b'l', b'm', b'n', b'o', b'p', b'q', b'r', b's', b't', b'u', b'v', b'w', b'x', b'y', b'z', b'0', b'1', b'2', b'3', b'4', b'5', b'6', b'7', b'8', b'9', b'-', b'_',
];
- 编码方式:
- 记有一串二进制数据作为输入数据(字节长度记为\(l\)), 按输入顺序每3个字节分为一组(不足3个字节的组末尾填充
0x00
补齐到三字节), 每组数据记为\(\upsilon_i,\ i=[0, (l+2)/3]\); - 将每组数据\(\upsilon_i\)按输入顺序每6位分为一组, 记为\(\nu_j, j=[0,3]\);
- 将每组中的每个\(\nu_j\)视为十进制索引, 然后依次将每个\(\nu_j\)替换为\(\mathbb{E}[\nu_j]\), 得到二进制输入数据的Base64编码输出;
- 如果因为输入数据长度不是3字节的整数倍而需要补\(m\)个
0x00
对齐时, 可自主选择在编码输出末尾补\(m*8/4\)个b'='
(不补也行, Base64编码输出字节长度必是4的整数倍);
- 记有一串二进制数据作为输入数据(字节长度记为\(l\)), 按输入顺序每3个字节分为一组(不足3个字节的组末尾填充
Base58
- Base58编码表, 记为\(\mathbb{E}\):
const BASE58_STD: [u8; 58] = [
b'1', b'2', b'3', b'4', b'5', b'6', b'7', b'8', b'9', b'A',
b'B', b'C', b'D', b'E', b'F', b'G', b'H', b'J', b'K', b'L',
b'M', b'N', b'P', b'Q', b'R', b'S', b'T', b'U', b'V', b'W',
b'X', b'Y', b'Z', b'a', b'b', b'c', b'd', b'e', b'f', b'g',
b'h', b'i', b'j', b'k', b'm', b'n', b'o', b'p', b'q', b'r',
b's', b't', b'u', b'v', b'w', b'x', b'y', b'z',
];
- 编码方式:
- 记由一串二进制数据作为输入数据, 按找字节输入顺序, 给每个字节编号为\(b_0, b_1,\dots,b_n\), 将其转换为一个大整数为\(x=\sum_{i=0}^{n}b_{i} 2^{8*(n-i)}\);
- 初始化输出字节串\(a\)为空;
loop
\(x \ne 0\):- \(a = BASE58\_STD[x\mod 58]\quad ||\quad a\); (注\(X||Y\)表示\(Y\)拼接在\(X\)之后);
- \(x = \lfloor \frac{x}{58} \rfloor\);
- 输出a;
- 解码是编码的逆过程, 不再赘述;
Base32
- Base32编码表, 记为\(\mathbb{E}\):
const BASE32_STD: [u8; 32] = [
b'A', b'B', b'C', b'D', b'E', b'F', b'G', b'H', b'I', b'J', b'K', b'L', b'M', b'N', b'O', b'P', b'Q', b'R', b'S', b'T', b'U', b'V', b'W', b'X', b'Y', b'Z', b'2', b'3', b'4', b'5', b'6', b'7',
];
const BASE32_URL: [u8; 32] = [
b'0', b'1', b'2', b'3', b'4', b'5', b'6', b'7', b'8', b'9', b'A', b'B', b'C', b'D', b'E', b'F', b'G', b'H', b'I', b'J', b'K', b'L', b'M', b'N', b'O', b'P', b'Q', b'R', b'S', b'T', b'U', b'V',
];
- 编码方式:
- 记有一串二进制数据作为输入数据(字节长度记为\(l\)), 按输入顺序每5个字节分为一组(不足5个字节的组末尾填充
0x00
补齐到五字节), 每组数据记为\(\upsilon_i,\ i=[0, (l+4)/5]\); - 将每组数据\(\upsilon_i\)按输入顺序每5位分为一组, 记为\(\nu_j, j=[0,5]\);
- 将每组中的每个\(\nu_j\)视为十进制索引, 然后依次将每个\(\nu_j\)替换为\(\mathbb{E}[\nu_j]\), 得到二进制输入数据的Base32编码输出;
- 如果因为输入数据长度不是5字节的整数倍而需要补\(m\)个
0x00
对齐时, 可自主选择在编码输出末尾补\(m*8/5\)个b'='
(不补也行, Base64编码输出字节长度必是8的整数倍);
- 记有一串二进制数据作为输入数据(字节长度记为\(l\)), 按输入顺序每5个字节分为一组(不足5个字节的组末尾填充
Base16
- Base16编码表, 记为\(\mathbb{E}\):
const BASE16_STD: [u8; 16] = [
b'0', b'1', b'2', b'3', b'4', b'5', b'6', b'7', b'8', b'9', b'A', b'B', b'C', b'D', b'E', b'F',
];
- 编码方式:
- 记有一串二进制数据作为输入数据(字节长度记为\(l\)), 按输入顺序将每个字节分为一组, 记为\(\upsilon_i\);
- 将每组数据\(\upsilon_i\)按输入顺序每4位一组, 记为\(\nu_j, j=[0,1]\);
- 将每组中的每个\(\nu_j\)视为十进制索引, 然后依次将每个\(\nu_j\)替换为\(\mathbb{E}[\nu_j]\), 得到二进制输入数据的Base16编码输出;
CSV
逗号分隔值文件格式, 语法形式如下:
file = [header CRLF] record *(CRLF record) [CRLF]
header = name * (COMMA name)
record = field * (COMMA field)
name = field
field = (escaped / non-escaped)
escaped = DQUOTE *(TEXTDATA / COMMA / CR / LF / 2DQUOTE) DQUOTE
non-escaped = *TEXTDATA
COMMA = 0x2C
CR = 0x0D
DQUOTE = 0x22
LF = 0x0A
CRLF = CR LF
TEXTDATA = 0x20-0x21 / 0x23-0x2B / 0x2D-0x7E
JSON
语言独立的基于文本的轻量级数据交换格式, 语法形式如下:
data = value, *
value = object | array | number | string | true | false | null
object = {string: value}
array = [value, *];
number = 实数集;
string = utf-8编码字符串;
XML
PEM
参考资料
- RFC 4648 (The Base 16, Base 32 and Base64 Data Encodings);
- RFC 4180 (Common Format and MIME Type for Comma-Seperated Values(CSV) Files);
- ECMA-404: The JSON Data Interchange Format(2ed Edition December 2017);
- XML;
- RFC 1421: Privacy Enhancement for Internet Electronic Mail;
- Base58 Encoder/Decoder;