我在将base64编码的字符串转换为二进制时遇到问题.我在下面的链接中收集 fingerprint ,

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))

已经非常感谢了!!

推荐答案

要解码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个字符)

Python-3.x相关问答推荐

如何有效地计算Kernel/Matrix

Numpy argmin()以查找最近的元组

按小时和日期对Pandas 数据帧进行分组

我用Kivy创建的应用程序在安卓系统上运行时出错.(attributeerror:';class';对象没有属性';_javaclass__cls_storage';)

通过在不重新索引的情况下采用最高概率的百分比,有效地转换 0/1 列表中的概率列表

过滤列表中的所有字典以使用特定键并忽略其他键?

位对的距离

matplotlib.pyplot 多边形,具有相同的纵横比和紧凑的布局

预分配一个无列表

如何注释一个以另一个函数作为参数的函数?

在数据类中创建类变量的正确方法

aiohttp+sqlalchemy:在回滚无效事务之前无法重新连接

__cause__ 和 __context__ 有什么区别?

Windows 下 Python 3.x 的 OpenCV

在 linux mint 上安装 python3-venv 模块

无法解码 Python Web 请求

将 Python 字节转换为无符号 8 位整数

首次使用后 zip 变量为空

在 PyCharm 中配置解释器:请使用不同的 SDK 名称

TypeError:无法将系列转换为