python base64 转十六进制

python base64 to hex

提问人:bky 提问时间:7/2/2017 更新时间:2/3/2019 访问量:30809

问:

两周以来,我一直在尝试和阅读来解决这个问题,但我尝试的一切都没有奏效:-(

我正在使用 python 2.7。

据我了解,我确实有一个格式为 base64 字符串:AAMkADk0ZjU4ODc1LTY1MzAtNDdhZS04NGU5LTAwYjE2Mzg5NDA1ZABGAAAAAAAZS9Y2rt6uTJgnyUZSiNf0BwC6iam6EuExS4FgbbOF87exAAAAdGVuAAC6iam6EuExS4FgbbOF87exAAAxj5dhAAA=

我想把它转换成一个十六进制字符串。这应该导致00000000194BD636AEDEAE4C9827C9465288D7F40700BA89A9BA12E1314B81606DB385F3B7B100000074656E0000BA89A9BA12E1314B81606DB385F3B7B10000318F97610000

我用以下代码尝试了一下:

def itemid_to_entryid(itemid):
    decoded_val = base64.b64decode(itemid)
    decoded_val = ''.join( ["%02X" % ord(x) for x in decoded_val ] ).strip()
    decoded_val = decoded_val.upper()
    return decoded_val


itemid = 'AAMkADk0ZjU4ODc1LTY1MzAtNDdhZS04NGU5LTAwYjE2Mzg5NDA1ZABGAAAAAAAZS9Y2rt6uTJgnyUZSiNf0BwC6iam6EuExS4FgbbOF87exAAAAdGVuAAC6iam6EuExS4FgbbOF87exAAAxj5dhAAA='

entryid = itemid_to_entryid(itemid)
print(entryid)

它总是返回以下内容:0003240039346635383837352D363533302D343761652D383465392D30306231363338393430356400460000000000194BD636AEDEAE4C9827C9465288D7F40700BA89A9BA12E1314B81606DB385F3B7B100000074656E0000BA89A9BA12E1314B81606DB385F3B7B10000318F97610000

我真的不明白,我做错了什么,真的很感激任何帮助来理解我做错了什么。

亲切问候 本

python base64 十六进制 解码

评论

0赞 Alex Hall 7/2/2017
你确定第一个十六进制字符串吗?我不明白为什么它会以这么多 0 开头。
3赞 Thierry Lathuille 7/2/2017
您的预期输出只是实际输出的末尾。因此,您应该有一些规则来切割您需要的部分。
1赞 Jon Clements 7/2/2017
好吧 - 这是给定输入的正确输出......我只想指出,这更直接binascii.hexlify(base64.b64decode(itemid)).upper()
0赞 bky 7/2/2017
@ThierryLathuille哇,你是对的......为什么我没有看到,但为什么我有这么多不必要的前导字符?
0赞 bky 7/2/2017
@JonClements非常感谢,这真的是一个非常棒的直截了当的代码行

答:

-2赞 Anthon 7/2/2017 #1

如果您只从预期的输出十六进制中获取前几个字节并转换它们:

import base64
base64.b64encode('\x00\x00\x00\x00\x19\x4B\xD6')

您将获得:

AAAAABlL1g==

这与输入的开头不匹配。

30赞 IvanD 12/14/2017 #2

将 base64 转换为十六进制字符串的最佳方法是:

# Python 2
>>> base64.b64decode('woidjw==').encode('hex')
# Python 3
>>> base64.b64decode('woidjw==').hex()
'c2889d8f'

您也可以像这样尝试:

>>> base64.b64decode('woidjw==')

但我不喜欢输出:

'\xc2\x88\x9d\x8f'

就您的原始请求而言,您的初始数据一定有问题,因为它不会产生您预期的数据:

>>> base64.b64decode('AAMkADk0ZjU4ODc1LTY1MzAtNDdhZS04NGU5LTAwYjE2Mzg5NDA1ZABGAAAAAAAZS9Y2rt6uTJgnyUZSiNf0BwC6iam6EuExS4FgbbOF87exAAAAdGVuAAC6iam6EuExS4FgbbOF87exAAAxj5dhAAA=').encode('hex')

'0003240039346635383837352d363533302d343761652d383465392d30306231363338393430356400460000000000194bd636aedeae4c9827c9465288d7f40700ba89a9ba12e1314b81606db385f3b7b100000074656e0000ba89a9ba12e1314b81606db385f3b7b10000318f97610000'