使用b64decode()将python 2.7中的base64转换为十六进制奇怪符号

使用b64decode()将python 2.7中的base64转换为十六进制奇怪符号,python,python-2.7,Python,Python 2.7,我需要将base64字符串解码为十六进制。例如: /6o=(基准64)至FFAA(十六进制) 我正在努力: encoded="/6o=" print base64.decodestring(encoded) 它给了我:�� 如果我这样做: encoded="/6o=" print base64.b64decode(string) 结果是一样的�� 使用binascii.hexlify(): 结果是2f366f3d,这不是我需要的FFAA。 使用string.decode('hex'): 结果

我需要将base64字符串解码为十六进制。例如: /6o=(基准64)至FFAA(十六进制) 我正在努力:

encoded="/6o="
print base64.decodestring(encoded)
它给了我:��

如果我这样做:

encoded="/6o="
print base64.b64decode(string)
结果是一样的��

使用binascii.hexlify():

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

结果-错误
TypeError:找到非十六进制数字

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

先谢谢你

致以最良好的祝愿, 奥列格·索莫夫试试这个:

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都有效。

试试以下方法:

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。

解决方案。 实际上,以下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

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


理解问题。
请注意,我在打印输出中使用了repr()

您的问题是由以下事实引起的:当我们使用带有
str
-类型的
print
-语句时(实际上是2.7中的字节), 首先,Python试图使用依赖于环境的编码将其解码为unicode类型。

例如,以下是我的Ubuntu和Win10终端在解码字节方面的区别:

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


顺便说一下,你可以拿到�-您在问题中用以下表达式描述的结果:

print unicode('\xff\xaa', 'utf-8', errors='replace')
输出:��

据我所知,这正是Python在您的案例中所做的。

解决方案。 实际上,以下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

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


理解问题。
请注意,我在打印输出中使用了repr()

您的问题是由以下事实引起的:当我们使用带有
str
-类型的
print
-语句时(实际上是2.7中的字节), 首先,Python试图使用依赖于环境的编码将其解码为unicode类型。

例如,以下是我的Ubuntu和Win10终端在解码字节方面的区别:

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


顺便说一下,你可以拿到�-您在问题中用以下表达式描述的结果:

print unicode('\xff\xaa', 'utf-8', errors='replace')
输出:��



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

Base64编码用于将二进制数据表示为文本,因此,如果您对Base64字符串进行解码,我猜您会得到ASCII字符,而不是十六进制值。所以您应该尝试将base64.decodestring(编码)转换为十六进制。。。你两个都试过了吗?@Semant1ka谢谢你的回答,我一个小时后再试试。所以你认为我需要做binascii.hexlify(base64.decodestring(string))?@OlegSomov我找到了一个更准确的解决方案,请参阅下面的答案base64编码用于将二进制数据表示为文本,所以如果你解码base64字符串,我想你希望得到的是ASCII字符,而不是十六进制值。所以您应该尝试将base64.decodestring(编码)转换为十六进制。。。你两个都试过了吗?@Semant1ka谢谢你的回答,我一个小时后再试试。所以你认为我需要做binascii.hexlify(base64.decodestring(string))?@OlegSomov我找到了一个更准确的解决方案,请参见下面的答案带括号的打印不一定意味着python 3。首先,您可以在Python2中使用
from\uuuuuu future\uuuuu导入print\u函数导入Python3的
print
命令。正如
(a)
a
相同,
print(a)
被解释为
print a
@Reti43谢谢你的留言,我不知道that@Semant1ka我刚刚从Python3到Python2.7进行了几次更改,所以左括号中的代码可以在这两个版本中使用。谢谢你的回答,它可以满足我的需要!(顺便说一句:是你的“-1”)@Oleg Somov不客气。不,那不是我,我不明白为什么你的问题是向下的。带括号的打印不一定意味着python 3。首先,您可以在Python2中使用
from\uuuuuu future\uuuuu导入print\u函数导入Python3的
print
命令。正如
(a)
a
相同,
print(a)
被解释为
print a
@Reti43谢谢你的留言,我不知道that@Semant1ka我刚刚从Python3到Python2.7进行了几次更改,所以左括号中的代码可以在这两个版本中使用。谢谢你的回答,它可以满足我的需要!(顺便说一句:是你的“-1”)@Oleg Somov不客气。不,那不是我,我不明白为什么你的问题被否决了谢谢你的解释。我知道打印时在解码字节时会出现问题,但我不知道到底是什么地方出了问题。你的解释很清楚。斯帕西博!谢谢你的解释。我知道