如何在python中将十六进制编码为base64?

时间:2019-02-24 18:49:28

标签: python base64

如果我尝试这样做:

from base64 import b64encode
b64encode('ffffff')

我收到此错误:

Traceback (most recent call last):
  File "<pyshell#13>", line 1, in <module>
    base64.b64encode('ffffff')
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/base64.py", line 58, in b64encode
    encoded = binascii.b2a_base64(s, newline=False)
TypeError: a bytes-like object is required, not 'str'

因为它说了类似字节的对象,所以我尝试了这一点:

b64encode(bytes('ffffff'))

哪个失败了。

Traceback (most recent call last):
  File "<pyshell#10>", line 1, in <module>
    b64encode(bytes('ffffff'))
TypeError: string argument without an encoding

最后,使用.encode('utf-8')函数:

b64encode('ffffff'.encode('utf-8'))

对于错误的输出b'ZmZmZmZm',正确的base64编码为////

我已经知道如何将b64解码为十六进制,所以不要说怎么做。

编辑:将此问题标记为与将十六进制字符串转换为十六进制字节相同。这涉及到base64。

2 个答案:

答案 0 :(得分:1)

要完全从字符串ffffff到十六进制值的base64,您需要使用codecs模块通过一些编码和解码来运行它:

import codecs
# Convert string to hex
hex = codecs.decode('ffffff', 'hex')
# Encode as base64 (bytes)
codecs.encode(hex, 'base64')

对于像0xfffff这样的奇长字符串,您需要在十六进制字符串(0x0fffff)的开头放置一个零,否则python会给您一个错误。

答案 1 :(得分:0)

这是使用编解码器的替代方法。
该代码可读性较差,但是效果很好,希望可以教您编解码器,十六进制和整数的工作方式。 (警告词,适用于奇数长度,但将忽略奇数字节字符串表示形式)

import struct
s = 'ffffff'
b''.join([struct.pack('B', int(''.join(x), 16)) for x in zip(s[0::2], s[1::2])])

应该给你b'\xff\xff\xff'

您的主要问题可能是您认为'ffffff'代表值255, 255, 255。他们没有。它们仍然是带有字母ff的字符串格式。随后,您需要将十六进制的字符串表示形式解析/转换为实际的十六进制。为此,我们可以先将字符串通过int()传递,这样可以以字符串表示形式的格式来使十六进制变通。

您将需要通过执行ff来分别转换每一对int('ff', 16),这将告诉Python将字符串以基数为16的整数(十六进制数)进行赋值。

然后将该整数转换为表示该整数的类似对象的字节。这就是struct.pack进入的地方。这正是出于这个目的。

struct.pack('B', 255) # 255 is given to us by int('ff', 16)

本质上,'B'告诉Python将值255打包到一个1字节对象中,在这种情况下,这将给我们b'\xff'这是您的最终目标。现在,对原始数据中的每两对字母执行此操作。


这更多是一种手动方法,您将一次遍历字符串中的2个字符,并使用上面的描述将它们捆绑为您希望的字符。或者只是使用编解码器,无论哪种方式都可以。

上述oneliner的扩展版本:

import struct
hex_string = 'ffffff'
result = b''
for pair in zip(hex_string[0::2], hex_string[1::2]):
    value = int(''.join(pair), 16)
    result += struct.pack('B', value)

至少,我希望这能解释十六进制如何在实际水平上工作。以及计算机如何渗透小时可读版本的位和字节。