首页 > 解决方案 > 将十六进制转换为 base64 - 在这个过程中真正发生了什么?

问题描述

试图制作简单的代码将十六进制字符串转换为base64:

我的想法是:十六进制->整数->二进制-> base64

所以我写了这个小代码:

import string


def bit(integer):
    # To binary
    return int(bin(integer))[2:]


#Hex multiply by 16 depending on position: 0xAB = A*(16**2) + B(16**1) = #10*16**2 + 11*16**1
    #0x3a2f
    #3*(16**2) + 7*(16**1) + 5


def removeletter(list):
    #"abcdef" = "10 11 12 13 14 15"

    for i, letter in enumerate(list):
        if letter in hextable.keys():
            list[i] = hextable[letter]
        
    return list



def todecimal(h):   
    power = 0
    l = [num for num in str(h)] #['3', 'a', '2', 'f']
    l = removeletter(l)
    l.reverse()                       #['f', '2', 'a', '3'] 

    for i, n in enumerate(l):
        
        number = int(n)
        l[i] = number*(16**power)
        power += 1

    l.reverse()
    return sum(l)


lowers = string.ascii_lowercase



hextable = {}
for number, letter in enumerate(lowers[:6]):
    hextable[letter] = number + 10

在我正在做的这个小挑战中,它说:

 The string:

49276d206b696c6c696e6720796f757220627261696e206c696b65206120706f69736f6e6f7573206d757368726f6f6d

Should produce:

SSdtIGtpbGxpbmcgeW91ciBicmFpbiBsaWtlIGEgcG9pc29ub3VzIG11c2hyb29t

好的, print(bit(todecimal('49276d206b696c6c696e6720796f757220627261696e206c696b65206120706f69736f6e6f7573206d757368726f6f6d')))

这应该得到十六进制字符串的二进制文件,如果我通过二进制到 base64 转换器,应该返回SSdtIGtpbGxpbmcgeW91ciBicmFpbiBsaWtlIGEgcG9pc29ub3VzIG11c2hyb29t. 或者我是这么想的。

└─$ python3 hextobase64.py
10010010010011101101101001000000110101101101001011011000110110001101001011011100110011100100000011110010110111101110101011100100010000001100010011100100110000101101001011011100010000001101100011010010110101101100101001000000110000100100000011100000110111101101001011100110110111101101110011011110111010101110011001000000110110101110101011100110110100001110010011011110110111101101101

使用十六进制到二进制转换器检查后,我可以看到二进制是正确的。现在,如果我通过二进制到 base64 转换器,它应该返回 SSdtIGtpbGxpbmcgeW91ciBicmFpbiBsaWtlIGEgcG9pc29ub3VzIG11c2hyb29t,对吗?

问题是,这个二进制到 base64 的转换器给了我kk7aQNbS2NjS3M5A8t7q5EDE5MLS3EDY0tbKQMJA4N7S5t7c3urmQNrq5tDk3t7a这对我来说很奇怪。所以我一定做错了什么。据我了解,十六进制可以用二进制表示,base64 也可以。base64 采用二进制并将二进制按 6 位分组以产生自己的表示。所以很明显,如果我有二进制文件,它应该是可以互换的,但是出了点问题。

我究竟做错了什么?

标签: python-3.xbinarybase64hex

解决方案


推荐阅读