代码之家  ›  专栏  ›  技术社区  ›  Eric Jin sud

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

  •  1
  • Eric Jin sud  · 技术社区  · 6 年前

    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 回复  |  直到 6 年前
        1
  •  1
  •   Eric Jin sud    6 年前

    完全脱离弦 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将给您一个错误。

        2
  •  0
  •   Torxed    6 年前

    这是使用编解码器的替代方法。
    这是一个有点不可读,但工作很好,希望教你如何编解码器,十六进制和整数工作。

    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' b'\xff' 这是你的最终目标。现在,对原始数据中的每2对字母执行此操作。


    这更像是一种手动方法,一次迭代字符串中的2个字符,并使用上面的描述将它们绑定到您期望的内容中。或者只使用编解码器,无论哪种方式都有效。

    上述一行程序的扩展版本:

    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)
    

    至少,我希望这能解释hex在实际层面上是如何工作的。以及计算机是如何穿透人类可读的位和字节的。