【问题标题】:Converting ip to binary将ip转换为二进制
【发布时间】:2015-05-09 06:02:49
【问题描述】:

我正在尝试将输入的 4 个 IP 地址八位字节转换为其二进制形式。这只是将第一个八位字节转换为其 8 位形式的代码的一部分。 'oc' 是八位字节 - 当我开始工作时,我会修复变量名。

remainder = 0

bits = (128,64,32,16,8,4,2,1)

binary = [0,0,0,0,0,0,0,0]

oc = int(input("Enter oc1: "))
if oc > 256:
    print("Only 256 or less")

if oc > bits[0] or oc == bits[0]:
    binary[0] = 1
    remainder = remainder + oc - bits[0]
    print(binary)
    print(remainder)
elif oc < bits[0]:
    binary[0] = 0
    print(binary)

if remainder > bits[1] or remainder == bits[1]:
    binary[1] = 1
    remainder = remainder - bits[1]
    print(binary)
    print(remainder)
elif oc < bits[1]:
    binary[1] = 0
    print(binary)

if remainder > bits[2] or oc == bits[2]:
    binary[2] = 1
    remainder = remainder - bits[2]
    print(binary)
    print(remainder)
elif oc < bits[2]:
    binary[2] = 0
    print(binary)

当我输入 128 或更大作为八位字节时,我得到一个成功的输出。

例如:输入 '192' 将显示 '1,1,0,0,0,0,0,0' 但低于 128 的任何内容都将显示为零。

我敢肯定,我也可以在大部分情况下使用循环,但不知道如何。

【问题讨论】:

  • 你看过ipaddress吗?
  • 我没有看到任何关于将 ip 转换为二进制形式的信息。只是想创建这个程序,以便在将 ip 转换为二进制时带来便利@PeterWood

标签: python python-3.x binary ip


【解决方案1】:

这对你有用吗?

oc = int(input("Enter oc1: "))
if oc > 256:
    print("Only 256 or less")
else:
    binary = bin(oc)[2:]

bin() 将整数转换为二进制,并使用 [2:] 附件删除前导“0b”,否则会得到。

如果你想确保你有 8 个字符,前导零,你可以使用 zfill()。作为另一个附件, zfill(n) 将添加前导零,直到您的字符串长度为 n 个字符。

binary = bin(oc)[2:].zfill(8)

【讨论】:

  • 刚接触python,这个方法让我大吃一惊!有什么方法可以保留最重要的零,因为在将 ip 转换为二进制时应该有 8 位? @Tom 谢谢!
  • 是的,使用 zfill()。我编辑了我的答案以包含它。您还应该考虑包含if oc &lt; 0: print('Non-negatives only'),以免 [2:] 无法完美运行。
【解决方案2】:

将 IPv4 地址转换为二进制:

ip=raw_input("Enter the ip address\n") #input the ipv4 address
ips=ip.split('.') #split by '.'

for i in ips:  #ips is a list of octets,
 ##we parse through the list to convert each of these to binary
    print(format(int(i),'08b')) #Use format '08b' to add leading '0' to form '8' digits of binary 'b'

输入:

192.95.01.56

输出:

11000000
01011111
00000001
00111000

【讨论】:

    【解决方案3】:

    @Tom 给出的解决方案似乎最合适。但是,如果您想上小学数学,将十进制转换为二进制,一个解决方案就是这样。

    import sys
    
    string = "127.0.0.1"
    oc = string.split(".")
    for i in range(0, 4) :
       num = int(oc[i]) 
       j = 0;
       remlist = []
       while num > 0 :
           rem = num % 2
           j = j + 1
           remlist.append(rem)
           num = num / 2
    
       for x in range(j, 8) :
           remlist.append(0)    
       for element in reversed(remlist) :  
           print element,
       if i < 3 :
           print ".", 
    

    【讨论】:

    • python 循环让我感到困惑.. 'for i in range(0, 4):' 中的 'i' 到底是什么意思?
    • python 循环让我感到困惑.. 'for i in range(0, 4):' 中的 'i' 到底是什么意思? @mayankTUM
    • 函数 string.split(".") 将字符串解析为大小为 4 的字符串数组。 range(0,4) 返回整数列表 [0,1,2,3] 'i' 只是遍历所有这些值的迭代器。类似于 c 或 java 中的“for(i = 0; i
    • 所以 string.split(".") 会在没有“.”的情况下生成字符串中的 4 个数字?如果我有这个代码: train = 1,2,3 for name in train: value = name*10 print(value) 'name' 在'for name'中代表什么?这是我不久前看到的一个例子@mayankTUM
    • 如果我正确理解了您的问题,name 将首先取值 1,然后是 2,依此类推。您将得到 10,20,30 作为输出。
    猜你喜欢
    • 2012-04-11
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    • 1970-01-01
    • 2016-10-02
    • 2019-05-07
    • 1970-01-01
    • 2011-09-04
    相关资源
    最近更新 更多