我正在编写一个函数来获取一个ip地址,将其每个部分(用'.'分隔(转换为一个8位二进制数字。然后我想把所有的二进制数字组合起来,得到一个32位的大数字,我想把它转换成十进制。当我的convert函数作为独立函数进行测试时,它可以正常工作,但当它在循环中运行时,它会给我TypeError: 'str' object cannot be interpreted as an integer
错误。
这就是问题所在:(从codewars-IPv4到int32(
取以下IPv4地址:128.32.10.1此地址有4个八位字节,其中每个八位字节是一个字节(或8位(。
第一个八位位组128具有二进制表示:10000000第二个八位位组32具有二进制表示:00100000第三个八位位组10具有二进制表示:00001010第4个八位位组1具有二进制表示:00000001因此128.32.10.1==10000000.00100000.00 001010.00000001
因为上面的IP地址有32位,我们可以将其表示为32位数字:2149583361。
编写一个函数ip_to_int32(ip((JS:ipToInt32(ip。
ip_to_int32("128.32.10.1"(=>2149583361
def convert(x):
return int(bin(x).replace("0b", ''))
def ip_to_int32(ip):
data = ip.split('.')
converted = []
for i in range(len(data)):
converted.append(convert(data[i]))
str = ''
for i in converted:
str += i
num = int(str)
return dec(num).replace('0d', '')
这是我得到的错误:
Traceback (most recent call last):
File "tests.py", line 4, in <module>
test.expect(ip_to_int32("128.114.17.104") == 2154959208, "wrong integer for ip: 128.114.17.104")
File "/workspace/default/solution.py", line 8, in ip_to_int32
converted.append(convert(data[i]))
File "/workspace/default/solution.py", line 2, in convert
return int(bin(x).replace("0b", ''))
TypeError: 'str' object cannot be interpreted as an integer
这就是测试文件:
test.describe("Basic Tests")
test.expect(ip_to_int32("128.114.17.104") == 2154959208, "wrong integer for ip: 128.114.17.104")
test.expect(ip_to_int32("0.0.0.0") == 0, "wrong integer for ip: 0.0.0.0")
test.expect(ip_to_int32("128.32.10.1") == 2149583361, "wrong integer for ip: 128.32.10.1")
谢谢你的帮助!
问题是convert()
的x
参数是一个字符串。不能将其用作bin()
的参数。
由于x
已经是整数的字符串表示,因此不需要将其转换为二进制然后再转换回十进制。您只需返回int(x)
(它实际上不需要是一个单独的函数(。
还有许多其他方法可以改进您的代码,但由于这是一个Codewars挑战,我将把它留给您。