【问题标题】:Convert a IP to Hex by Python通过 Python 将 IP 转换为十六进制
【发布时间】:2014-01-23 18:20:12
【问题描述】:

我正在编写一个将 IP 转换为 HEX 的脚本。以下是我的脚本:

import string
ip = raw_input('Enter IP')
a = ip.split('.')
b = hex(int(a[0])) + hex(int(a[1])) + hex(int(a[2])) + hex(int(a[3]))
b = b.replace('0x', '')
b = b.upper()
print b

我的问题是对于像 115.255.8.97 这样的 IP,我得到了这个:

答案来了:73FF861

预期答案:73FF0861

谁能聪明地告诉我我犯了什么错误。

【问题讨论】:

    标签: python string python-2.7


    【解决方案1】:

    从 python v3.5 开始,您可以这样做:

    import socket
    socket.inet_aton(ip).hex()
    

    https://docs.python.org/3/library/stdtypes.html#typebytes

    【讨论】:

      【解决方案2】:
      import socket, struct
      
      # Convert a hex to IP
      def hex2ip(hex_ip):
          addr_long = int(hex_ip,16)
          hex(addr_long)
          hex_ip = socket.inet_ntoa(struct.pack(">L", addr_long))
          return hex_ip
      
      # Convert IP to bin
      def ip2bin(ip):
          ip1 = '.'.join([bin(int(x)+256)[3:] for x in ip.split('.')])
          return ip1
      
      # Convert IP to hex
      def ip2hex(ip):
          ip1 = '-'.join([hex(int(x)+256)[3:] for x in ip.split('.')])
          return ip1
      
      print hex2ip("c0a80100")
      print ip2bin("192.168.1.0")
      print ip2hex("192.168.1.0")
      

      【讨论】:

      • 请不要给出裸代码答案。还要解释代码的作用。
      • hex2ip(hex_ip) 将 hex 转换为 IP, ip2bin(ip) 将 IP 转换为 bin , ip2hex(ip) 将 IP 转换为 hex
      【解决方案3】:
      >>>import binascii
      >>>import socket
      >>>binascii.hexlify(socket.inet_aton('115.255.8.97'))
      '73ff0861'
      >>>binascii.hexlify(socket.inet_aton('10.255.8.97'))
      '0aff0861'
      

      在上面的IP到十六进制转换输出中,如果输出以'0'开头,例如。 0aff0861 然后我想删除 0 并且输出应该看起来像 aff0861。有没有直接转换的方法。

      【讨论】:

      • 你能把你的问题放到评论里吗?问题是,将问题作为答案会误导读者。 (至少我被误导了;)
      【解决方案4】:

      由于十六进制没有前导零,您可以使用zfill(2)

      import string
      ip = raw_input('Enter IP')
      a = ip.split('.')
      b = hex(int(a[0]))[2:].zfill(2) + hex(int(a[1]))[2:].zfill(2) + hex(int(a[2]))[2:].zfill(2) + hex(int(a[3]))[2:].zfill(2)
      b = b.replace('0x', '')
      b = b.upper()
      print b
      

      我们仅使用 [2:](删除“0x”)获取十六进制数字,然后仅在需要时添加 2 个前导零。

      示例输出:

      Enter IP 192.168.2.1
      C0A80201
      

      示例输出:

      Enter IP 115.255.8.97
      73FF0861
      

      编辑1:

      通过@volcano 请求,您可以用列表推导替换:

      b = "".join([hex(int(value))[2:].zfill(2) for value in a])
      

      【讨论】:

      • 哇,你真的全都输入了>列表理解怎么样?
      【解决方案5】:

      hex 函数不使用前导零填充。

      >>> hex(8).replace('0x', '')
      '8'
      

      使用str.format02X 格式规范:

      >>> '{:02X}'.format(8)
      '08'
      >>> '{:02X}'.format(100)
      '64'
      

      >>> a = '115.255.8.97'.split('.')
      >>> '{:02X}{:02X}{:02X}{:02X}'.format(*map(int, a))
      '73FF0861'
      

      或者你可以使用binascii.hexlify + socket.inet_aton:

      >>> import binascii
      >>> import socket
      >>> binascii.hexlify(socket.inet_aton('115.255.8.97'))
      '73ff0861'
      >>> binascii.hexlify(socket.inet_aton('115.255.8.97')).upper()
      '73FF0861'
      

      【讨论】:

      • 这看起来很不错。有什么方法可以让我输入多行作为 raw_input() 的输入?
      • @user2922822,您可以迭代sys.stdin 以获取所有行。或重复拨打raw_input()
      猜你喜欢
      • 2015-06-29
      • 2010-11-24
      • 1970-01-01
      • 2015-08-10
      • 2010-12-15
      • 2011-08-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多