Python Base64转Hex

9
自两周前起,我一直在尝试并阅读解决这个问题,但是我所尝试的一切都没有成功:(
我正在使用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

但实际上我不知道我的问题在哪里,非常希望得到任何有关我错误的帮助。

祝好 Ben


你确定第一个十六进制字符串是正确的吗?我不明白为什么它会以这么多个 0 开头。 - Alex Hall
3
你期望的输出只是真实输出的结尾部分。因此,你需要制定一些规则来剪切出你需要的部分。 - Thierry Lathuille
1
好的 - 针对给定的输入,这就是正确的输出...我只想指出binascii.hexlify(base64.b64decode(itemid)).upper()更加直观。 - Jon Clements
@ThierryLathuille 哇,你说得对...为什么我没看到呢,但是为什么我有那么多不必要的前导字符? - bky
@JonClements非常感谢,这确实是一条非常棒的直截了当的代码行。 - bky
3个回答

30

将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'

0
对于其他想要前缀为\x的人,你可以尝试以下代码:
base64_response = "aGVsbG8h"
base64_decoded_response = base64.b64decode(base64_response) 
print(''.join([rf'\x{byte:02x}' for byte in base64_decoded_response])) 
'\x68\x65\x6c\x6c\x6f\x21' 

-1

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

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

你得到的是:
AAAAABlL1g==

这不与您的输入开头匹配。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接