将BASE64字符串转换为BASE16(HEX)字符串?

嘿,我正在尝试编写一个程序,从BASE64字符串转换为BASE16(HEX)字符串。

这是一个例子:

BASE64: Ba7+Kj3N HEXADECIMAL: 05 ae fe 2a 3d cd BINARY: 00000101 10101110 11111110 00101010 00111101 11001101 DECIMAL: 5 174 254 42 61 205 

从BASE64转换为HEXIDECIMAL的逻辑是什么?
为什么十进制表示法被拆分了?
为什么二进制表示被分成6个部分?

只想要数学,我能处理的代码只是这个过程令我感到困惑。 谢谢 :)

这是一个可在任意两个基础之间转换的function列表: https : //sites.google.com/site/computersciencesourcecode/conversion-algorithms/base-to-base


编辑(希望完全清楚……)

您可以在Basepedia的Wikipedia条目中找到更多相关信息。

用于base 64的习惯字符集与您在编辑之前提供的链接中找到的字符集不同,是:

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

字符’A’是值0,’B’是值1,’C’是值2,…’8’是值60,’9’是值61,’+’是值62,而’/’是值63.这个字符集与我们习惯用于二进制,八进制,十进制和hex的字符集非常不同,其中第一个字符是’0’,表示值0等

Soju在对这个答案的评论中指出,每个基数为64位需要6位来表示二进制。 使用原始问题中提供的base 64号码并从base 64转换为binary,我们得到:

 B a 7 + K j 3 N 000001 011010 111011 111110 001010 100011 110111 001101 

现在我们可以将所有位推到一起(这些空间只是帮助人们读取数字):

 000001011010111011111110001010100011110111001101 

接下来,我们可以从最低有效位开始,每四位引入一个新的空白分隔符:

 0000 0101 1010 1110 1111 1110 0010 1010 0011 1101 1100 1101 

现在应该很容易看出这个数字如何转换为16:

 0000 0101 1010 1110 1111 1110 0010 1010 0011 1101 1100 1101 0 5 AEFE 2 A 3 DCD 

将base-64视为基础(2 ^ 6),因此为了与hex半字节对齐,您需要至少2个基本64位数…

有2个base-64位数字你有一个base(2 ^ 12)数字,可以用3 2 ^ 4个数字表示……

 (00)(01)(02)(03)(04)(05)---(06)(07)(08)(09)(10)(11) (base-64) maps directly to: (00)(01)(02)(03)---(04)(05)(06)(07)---(08)(09)(10)(11) (base 16) 

所以你可以转换为连续的二进制…或者使用4个操作……操作可以处理二进制值,或者它们可以使用一组查找表(可以对char编码的数字起作用):

  1. 第一个base-64位到第一个hex数字
  2. 第一个基数为64位到第二个hex数字的前半部分
  3. 第二个基数为64位到第二个hex数字的后半部分
  4. 第二个基数-64位到第三个hex数字。

这样做的好处是你可以在没有二进制转换的情况下处理编码基础。 在chars流中很容易做到…我不知道这实际上是在任何地方实现的。