我需要将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?
提前谢谢。
祝你好运, 奥列格索莫夫
答案 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终端中解码字节的差异:
此类行为的原因是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。