【2024字节青训·易】Base32编码与解码

【2024字节青训·易】Base32编码与解码

问题描述

你需要实现一个 Base32 的编码和解码函数。

相比于 Base32,你可能更熟悉 Base64,Base64 是非常常见的用字符串形式表示二进制数据的方式,在邮件附件、Web 中的图片中都有广泛的应用。

Base32 是 Base64 的变种,与 Base64 不同的地方在于 Base64 以 6 bit 为一组作为索引,而 Base32 以 5 bit 为一组作为索引,每一组用一个 ASCII 字符表示。Base 64 总共需要 64 个字符表示,而 Base32 则只需要 32 个字符表示。

Base32 的编码流程如下:

  • 对二进制数据进行预处理:如果二进制数据的 bit 数目不不是 5 的倍数的话,在末尾补 0 直至为 5 的倍数
  • 以 5 bit 为一组进行分组
  • 将每一组的 5 bit 二进制转换为索引(0 - 31)
  • 在索引 - 字符转换表中查询索引对应的字符
  • 根据原始二进制数据的 bit 数目除以 40 后的余数,确定末尾需要补 0 的数目
    • 如果原始二进制数据 bit 数目除以 40 后的余数是 0 的话,不需要补 +
    • 如果原始二进制数据 bit 数目除以 40 后的余数是 8 的话,补 6 个 +
    • 如果原始二进制数据 bit 数目除以 40 后的余数是 16 的话,补 4 个 +
    • 如果原始二进制数据 bit 数目除以 40 后的余数是 24 的话,补 3 个 +
    • 如果原始二进制数据 bit 数目除以 40 后的余数是 32 的话,补 1 个 +

Base32 的索引 - 字符转换表见下方。

索引:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

字符:9 8 7 6 5 4 3 2 1 0 m n b v c x z a s d f g h j k l p o i u y t

示例

编码

  • 输入:字符串 foo
  • 字符 f 的 ASCII 编号为 102,字符 o 的 ASCII 编号为 111
  • 将字符串 foo 以 ASCII 编号形式表达为 102 111 111 的序列
  • 将 102 111 111 的序列转换为二进制表示,即 01100110 01101111 01101111,将二进制字符串以 40 个为一组进行分割
  • 最后一组的二进制字符串长度为 24,不是 5 的倍数,因此在最后补 0,直至其能被 5 整除(在此例子中,补 1 个即可),二进制字符串表示为: 01100110 01101111 01101111 0
  • 每 5 bit 为一组,表示为:01100 11001 10111 10110 11110
  • 将每一组转换为十进制的索引,表示为:12 25 23 22 30,对应字符 b l j h y
  • 由于最终输出字符串长度不是 8 的倍数,在输出最后补充 3 个 +
  • 查询索引 - 字符转换表后,可以得出最终的输出为:bljhy+++
Input data: foo`
`Input in Unicode: 102 111 111`
`Unicode in binary (8-bit): 01100110 01101111 01101111 0`
`Unicode in binary (5-bit): 01100 11001 10111 10110 11110`
`Decimal: 12 25 23 22 30`
`Pad: + + +`
`Output: b l j h y + + +

解码

  • 输入:bljhy+++
  • 查询索引 - 字符转换表后,可知原始的二进制数据组为:01100 11001 10111 10110 11110
  • 由末尾 3 个 + 可知在编码时原始二进制数据最后一组的个数为 24 个,由此可知最后一组数据为:01100110 01101111 01101111
  • 将二进制数据转换为 ASCII 编号后可知,原始字符串的 Unicode 序列为:102 111 111
  • 将 Unicode 序列转换为字符串,即可得出原始字符串,为:foo

输入示例

foo`
`b0zj5+++
  • 第一行为需要编码的原始字符串:rawStr
  • 第二行为需要解码的 Base32 字符串:encodedStr

输出示例

bljhy+++`
`bar

解释

  • 第一行编码后的输出为 bljhy+++
  • 第二行解码后的输出为 bar

数据范围

rawStr[n]` 为 ASCII 的可显示字符,`rawStr.length < 2048`
`encodedStr` 为使用此算法编码后的 Base32 字符序列,`encodedStr.length < 4096
def base32_encode(rawStr):
    base32_chars = "9876543210mnbvcxzasdfghjklpoiuyt"
    binary_string = ''.join
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值