为什么此代码段会导致:TypeError 'int' object is not subscriptable
?
return (bin(int(hexdata)[2:].zfill(16)))
hexdata
是十六进制字符串。例如,它可能是0x0101
。
答案 0 :(得分:4)
你这样做:
>>> int('1234')[2:]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object has no attribute '__getitem__'
>>> 1234[2:]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object has no attribute '__getitem__'
如果您打算删除前两个字符,请使用以下命令:
>>> int('1234'[2:])
34
如果orignal字符串是十六进制表示,则应传递可选的base
参数16
>>> int('1234'[2:], 16)
52
如果[2:]
用于删除0b
生成的bin
(不删除原始字符串中的前导字符),则可以使用以下内容。
>>> int('0x1234', 16) # No need to remove leading `0x`
4660
>>> int('0x1234', 0) # automatically recognize the number's base using the prefix
4660
>>> int('1234', 16)
4660
>>> bin(int('1234', 16))
'0b1001000110100'
>>> bin(int('1234', 16))[2:]
'1001000110100'
>>> bin(int('1234', 16))[2:].zfill(16)
'0001001000110100'
顺便说一句,您可以使用str.format
或format
代替bin
+ str.zfill
:
>>> '{:016b}'.format(int('1234', 16))
'0001001000110100'
>>> format(int('1234', 16), '016b')
'0001001000110100'
<强>更新强>
如果您指定0作为基础,int
将使用前缀自动识别该数字的基数。
>>> int('0x10', 0)
16
>>> int('10', 0)
10
>>> int('010', 0)
8
>>> int('0b10', 0)
2
答案 1 :(得分:1)
括号在错误的地方。假设您有一个像“0x0101”这样的字符串,您希望最终得到一个16位二进制字符串:
bin(int(hexdata,16))[2:].zfill(16)
int(X,16)
调用将其解释为十六进制数字(并且可以接受多个形式0xSomething
)。然后bin(X)
将其转换为0b01010101
形式的字符串。
[2:]
然后摆脱前面的0b
,zfill(16)
填充16“位。
>>> bin(int("0x0102",16))[2:].zfill(16)
'0000000100000010'