【问题标题】:Python converting from base64 to binaryPython从base64转换为二进制
【发布时间】:2017-08-29 16:44:56
【问题描述】:

我在将 base64 编码字符串转换为二进制时遇到问题。我正在以下链接中收集 Fingerprint2D,

url = "https://pubchem.ncbi.nlm.nih.gov/rest/pug/compound/cid/108770/property/Fingerprint2D/xml"

Fingerprint2D=AAADccB6OAAAAAAAAAAAAAAAAAAAAAAAAAA8WIEAAAAAAACxAAAAHgAACAAADAzBmAQwzoMABgCI AiTSSACCCAAhIAAAiAEMTMgMJibMsZuGeijn4BnI+YeQ0OMOKAACAgAKAABQAAQEABQAAAAAAAAA AA==

Pubchem 中的描述说这是 115 字节的字符串,转换成二进制应该是 920 位。我尝试使用以下将其转换为二进制文件,

    response = requests.get(url)
    tree = ET.fromstring(response.text)

    for el in tree[0]:
        if "Fingerprint2D" in el.tag:
            fpp = bin(int(el.text, 16))
            print(len(fpp))

如果我使用上面的代码,我会收到以下错误,“Value error: invalid literal for int() with base16:

如果我使用下面的代码,fpp(二进制)的长度等于 1278,这不是我所期望的。

    response = requests.get(url)
    tree = ET.fromstring(response.text)

    for el in tree[0]:
        if "Fingerprint2D" in el.tag:
            fpp = bin(int(hexlify(el.text), 16))
            print(len(fpp))

已经非常感谢了!!

【问题讨论】:

    标签: python python-3.x binary base64 hex


    【解决方案1】:

    python 3 最简单​​的方法是:

    import base64    
    base64.b64decode(base64_to_binary_input) 
    

    【讨论】:

      【解决方案2】:

      要解码 base64 格式,您需要将 bytes 对象传递给 base64.decodebytes 函数:

      import base64
      
      t = "AAADccB6OAAAAAAAAAAAAAAAAAAAAAAAAAA8WIEAAAAAAACxAAAAHgAACAAADAzBmAQwzoMABgCI AiTSSACCCAAhIAAAiAEMTMgMJibMsZuGeijn4BnI+YeQ0OMOKAACAgAKAABQAAQEABQAAAAAAAAA AA==".encode("ascii")
      
      decoded = base64.decodebytes(t)
      
      print(decoded)
      print(len(decoded)*8)
      

      我得到以下信息:

      b'\x00\x00\x03q\xc0z8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00<X\x81\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\x1e\x00\x00\x08\x00\x00\x0c\x0c\xc1\x98\x040\xce\x83\x00\x06\x00\x88\x02$\xd2H\x00\x82\x08\x00! \x00\x00\x88\x01\x0cL\xc8\x0c&&\xcc\xb1\x9b\x86z(\xe7\xe0\x19\xc8\xf9\x87\x90\xd0\xe3\x0e(\x00\x02\x02\x00\n\x00\x00P\x00\x04\x04\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00'
      920
      

      所以 920 位符合预期。

      要以二进制形式获取数据,只需迭代字节并使用 format 和零填充到 8 位转换为二进制(bin 添加了 0b 标头,因此它不适合)和 join 字符串一起:

      print("".join(["{:08b}".format(x) for x in decoded]))
      

      结果:

      00000000000000000000001101110001110000000111101000111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011110001011000100000010000000000000000000000000000000000000000000000001011000100000000000000000000000000011110000000000000000000001000000000000000000000001100000011001100000110011000000001000011000011001110100000110000000000000110000000001000100000000010001001001101001001001000000000001000001000001000000000000010000100100000000000000000000010001000000000010000110001001100110010000000110000100110001001101100110010110001100110111000011001111010001010001110011111100000000110011100100011111001100001111001000011010000111000110000111000101000000000000000001000000010000000000000101000000000000000000101000000000000000001000000010000000000000101000000000000000000000000000000000000000000000000000000000000000000
      

      (如预期的那样是 920 个字符)

      【讨论】:

      • 你能告诉我如何将这些位转换为 NumPy 数组到这个 base64 的大小(w*h)吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-10
      相关资源
      最近更新 更多