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

时间:2011-04-03 22:40:04

标签: c

嘿,我正在尝试编写一个程序,将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个部分?

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

2 个答案:

答案 0 :(得分:8)

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


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

您可以在Wikipedia entry for Base 64找到更多相关信息。

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

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

字符'A'是值0,'B'是值1,'C'是值2,...'8'是值60,'9'是值61,'+ '是值62,'/'是值63.这个字符集与我们习惯用于二进制,八进制,基数10和十六进制的字符集非常不同,其中第一个字符是'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     A     E     F     E     2     A     3     D     C     D

答案 1 :(得分:0)

将base-64视为基础(2 ^ 6) 所以为了与十六进制半字节对齐,你需要至少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位到第一个十六进制数字
  2. 第一个base-64位到第二个十六进制数字的前半部分
  3. 第二个基数-64位到第二个十六进制数字的后半部分
  4. 第二个基数-64位到第三个十六进制数字。
  5. 这样做的好处是你可以在没有二进制转换的情况下处理编码的基础。 在chars流中很容易做到......我不知道这实际上是在任何地方实现的。