Base32 编码和解码问题| 豆包MarsCode AI刷题

88 阅读2分钟

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 后的余数,确定末尾需要补 + 的数目。
  • 如果原始二进制数据 bit 数目除以 40 后的余数是 0 的话,不需要补 +
  • 如果余数是 8,补 6 个 +
  • 如果余数是 16,补 4 个 +
  • 如果余数是 24,补 3 个 +
  • 如果余数是 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

你需要对字符串rawStr进行编码,并对encodedStr进行解码。


测试样例

样例1:

输入:rawStr = "foo", encodedStr = "b0zj5+++"
输出:"bljhy+++:bar"

样例2:

输入:rawStr = "The encoding process", encodedStr = "bljhy+++b0zj5+++"
输出:"maf3m164vlahyl60vlds9i6svuahmiod:foobar"

样例3:

输入:rawStr = "Base32 encoding and decoding", encodedStr = "bvchz+++v4j21+++cals9+++"
输出:"10zj3l0d31z3mod6vus3sod258zhil89bash3oo5v4j3c+++:c]hintts "

思路

按照题目要求编码,反过来即为解码,注意多个组进行解码时要用到while循环(这里吐槽一下marcode把索引都打错了,有的时候还是要检查一下)