0%

base64编码字符串的长度计算方法

遇到的问题

我想在数据库中存一个被转化为Base64字符串的SHA256哈希值,我在想要用什么类型的值来存储,是用Text还是char[n],这实际上和base64编码的长度有关,于是就查了下wiki。

编码原理

编码其实是基于一个64个数值的编码表(图源维基百科):
base64编码表

也就是说每一个base64字符能够表示6bit的内容(2的6次方为64),换句话说,每4个base64字符(4 * 6 = 24)可以表示3(3 * 8 = 24)字节的内容。

如果原始的字节数不是3的倍数,比如4字节(剩余1字节)或者5字节(剩余2字节),则需要再末尾处理,一共可以分为2种情况。

  1. 如果剩余1字节,需要补2字节(16bit)才是3的倍数。也就是要则补16个0,加上前面剩余的1字节(8bit),一共是24个bit,其中24个bit的前12bit(2*6)构成两个base64字符,剩下的12bit(2*6)全部是0,用两个等号 == 表示。

  2. 如果剩余2字节,需要补1字节(8bit)才是3的倍数。也就是要则补8个0,加上前面剩余的2字节(16bit),一共是24个bit,其中24个bit的前18bit(3*6)构成三个base64字符,剩下的6bit(1*6)全部是0,用一个等号 = 表示。

如图所示(图源维基百科):

两种特殊情况

也就是说,原始数据不够3字节就会补全到3个字节,这3个字节会相应地转化为4个base64字符。

结论

所以说最后的计算公式应该是:

向上取整(原始字节数 / 3) * 4

而SHA256的结果一共是256bit,也就是32字节,根据上述公式,最后的base64编码长度应该是44字节,应该使用char[44]存储。

验证

写个脚本验证一下:

1
2
3
4
5
6
7
8
9
10
11
from hashlib import sha256
from math import ceil
from base64 import b64encode

data = 'test'

print('公式计算长度: ', ceil(len(data) / 3) * 4)
print('实际编码长度: ', len(b64encode(data.encode()).decode()))

print('SHA256编码后长度: ',
len(b64encode(sha256(data.encode('utf-8')).digest()).decode()))

输出结果:

1
2
3
公式计算长度:  8
实际编码长度: 8
SHA256编码后长度: 44

与理论值相符合。

参考资料:Base64 - 维基百科,自由的百科全书 (wikipedia.org)

本文地址: https://www.chimaoshu.top/base64编码字符串的长度计算方法/
版权声明:本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议,转载请注明出处。

Welcome to my other publishing channels