使用b64decode()将base64转换为hex的python 2.7奇怪的符号

时间:2017-10-22 18:47:30

标签: python python-2.7

我需要将base64字符串解码为十六进制。例如: / 6o =(base64)到FFAA(十六进制) 我在尝试:

encoded="/6o="
print base64.decodestring(encoded)

它给了我:

如果我这样做:

encoded="/6o="
print base64.b64decode(string)

结果是相同的

使用binascii.hexlify():

string="/6o="
printbinascii.hexlify(string)

结果是2f366f3d,这不是FFAA,因为我需要。 使用string.decode('hex')

string="/6o="
print string.decode('hex')

结果 - 错误TypeError: Non-hexadecimal digit found

使用this service我可以正确解码我的base64字符串。 如何将base64解码为base16?

提前谢谢。

祝你好运, 奥列格索莫夫

2 个答案:

答案 0 :(得分:2)

解决方案。

实际上,以下3种方法适用于Python 2.7:

b64 = "/6o="

#1
b16 = b64.decode('base64')
print repr(b16) # '\xff\xaa'

import base64

#2
b16 = base64.b64decode(b64)
print repr(b16) # '\xff\xaa'

#3
b16 = base64.decodestring(b64)
print repr(b16) # '\xff\xaa'

使用它们,您将以十六进制表示形式获得字节 然后,如果需要,您可以将字节转换为所需的输出,例如:

print b16.encode('hex').upper() # 'FFAA'

但请注意 - 现在它是其他字节:

print 'FFAA' == '\xff\xaa' # False

总结,最快的解决方案(无需导入):

b64 = "/6o="
print b64.decode('base64').encode('hex').upper() # 'FFAA'

了解问题。

请注意,我在打印输出中使用了 repr()

你的问题是由于当我们使用带有print的{​​{1}} - 语句 - 类型(实际上是2.7中的字节)时, 首先,Python试图将其解码为str - 使用依赖于环境的编码进行类型化。

例如,下面分别是我的Ubuntu和Win10终端中解码字节的差异:

enter image description here

此类行为的原因是unicode不是有效的'\xff\xaa'字节序列,因此无法使用此编码将其解码为字符。在这种情况下,错误被符号replaced替换。
同时,这些字节在UTF-8中有效,我们可以看到解码的结果。

顺便说一句,您可以使用以下表达式获得您在问题中描述的�结果:

cp1251

输出:��

据我了解,这正是Python在您的情况下所做的。

答案 1 :(得分:1)

试试这个:

import base64
import codecs

encoded="/6o="
decoded = base64.b64decode(encoded)
b_string = codecs.encode(decoded, 'hex')
print(b_string.decode('utf-8').upper())

它会给你:

FFAA

这适用于Python 2.7和Python 3.6。