如何将IP地址转换成为一个整数

请编写一个函数实现将IP地址转换为一个整数.

  • 首先要明白转换的思路.
    IP地址是一个点分十进制的字符串例如:127.1.1.1
    首先是将这个IP地址按照.进行分隔,然后每部分都表示成二进制形式.
    最后再将这些二进制的字符串进行拼接,进而转换为int类型.
# encoding:utf-8
__author__ = 'Fioman'
__date__ = '2018/11/19 8:37'
import socket
import struct


# IP地址转换为int
# 思路IP按照split进行分隔成4个部分,然后每个部分都转换为二进制类型.
# 然后将这些二进制进行拼接成一个32位的大的二进制字符串.
# 最后将这个二进制数,转换成对应的int类型
def ipToInt(ip_str):
    # 分隔
    ip_list = ip_str.split('.')

    # 拼接
    bin_str = ""
    # 遍历,然后求出每一个二进制数,(注意切割,舍弃0b),还要把它弄成8位.再相加
    for i in ip_list:
        part = bin(int(i))[2:]
        # 将part前面补充0
        part = part.zfill(8)
        bin_str += part

    # 最后将这个二进制数转换为整数
    ip_int = int(bin_str, 2)

    return ip_int


# 另外一种方法,通过内置模块socket模块
def ipToInt2(ip_str):
    # 首先将ip地址字符串转换为整型,使用inet_aton
    ret = socket.ntohl(struct.unpack('I', socket.inet_aton(str(ip)))[0])
    return ret


# 将int类型的数,先转换为32位的二进制数.然后按8位进行分隔.每八位表示一个IP的一部分即可.
def intToIp(ip_int):
    ip_bin = bin(ip_int)[2:]
    ip_bin = ip_bin.zfill(32)

    bin_list = []
    ip_str = []

    for i in range(0, 32, 8):
        bin_list.append(ip_bin[i:i + 8])

    for temp in bin_list:
        ip_str.append(str(int(temp, 2)))

    ret = ".".join(ip_str)
    return ret


# 第二种通过内置模块完成,将整型转换为IP地址格式地址
def intToIp2(ip):
    ret = socket.inet_ntoa(struct.pack("I", socket.htonl(ip)))
    return ret


if __name__ == '__main__':
    ip = '7.91.205.21'
    print(ipToInt(ip))

    print(ipToInt2('7.91.205.21'))

    print(intToIp(123456789))
    print(intToIp2(123456789))

还有一种通过位移的方式

请编写一个函数实现将IP地址转换成一个整数。
如 10.3.9.12 转换规则为:
        10            00001010
         3            00000011
         9            00001001
        12            00001100
再将以上二进制拼接起来计算十进制结果:00001010 00000011 00001001 00001100 = ?


def v1(addr):
    # 取每个数
    id = [int(x) for x in addr.split(".")]
    print(id)
    return sum(id[i] << [24, 16, 8, 0][i] for i in range(4))

print(v1("127.0.0.1"))

# [127, 0, 0, 1]
# 2130706433

总结,可以通过分步拆分,或者是位移的方式来进行解决这类问题.

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,084评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,623评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,450评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,322评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,370评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,274评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,126评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,980评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,414评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,599评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,773评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,470评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,080评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,713评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,852评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,865评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,689评论 2 354

推荐阅读更多精彩内容