如果我尝试这样做:
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。
答案 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)
至少,我希望这能解释十六进制如何在实际水平上工作。以及计算机如何渗透小时可读版本的位和字节。