0%
التحويل بين الأعداد الصحيحة ذات 32 بت وعناوين IPv4 باستخدام Python

التحويل بين الأعداد الصحيحة ذات 32 بت وعناوين IPv4 باستخدام Python

تعلّم كيفية تنفيذ دوال لتحويل الأعداد الصحيحة ذات 32 بت إلى عناوين IPv4 والعكس، وهو أمر مفيد في معالجة الشبكات والأمن.

I

InSkillCoach

· دقيقة

مقدمة

في مجال شبكات الحاسوب، تُمثَّل عناوين IPv4 عادةً في صورة سلسلة نصية مفهومة للإنسان (مثل 192.168.1.1). لكن على مستوى الآلة، تُخزَّن هذه العناوين وتُعالَج على شكل أعداد صحيحة ذات 32 بت. والتحويل بين هاتين الصيغتين عملية أساسية في كثير من تطبيقات الشبكات والأمن وإدارة الأنظمة.

في هذا الدرس سنستكشف كيف:

  • نحوّل عنوان IPv4 إلى عدد صحيح ذي 32 بت
  • نحوّل عددًا صحيحًا ذا 32 بت إلى عنوان IPv4
  • نطبّق هذه التحويلات في حالات عملية

الأسس النظرية

يتكوّن عنوان IPv4 من 4 بايتات (32 بت في المجموع). يمكن أن تتراوح قيمة كل بايت بين 0 و255. وعندما نرى عنوانًا مثل 192.168.1.1، فإننا في الواقع ننظر إلى التمثيل العشري المنقوط للقيمة الثنائية 11000000.10101000.00000001.00000001.

لتحويل هذا العنوان إلى عدد صحيح واحد، يمكننا استخدام الصيغة التالية:

entier = (octet1 * 256³) + (octet2 * 256²) + (octet3 * 256¹) + (octet4 * 256⁰)

وهي تكافئ:

entier = (octet1 << 24) | (octet2 << 16) | (octet3 << 8) | octet4

التنفيذ في Python

تحويل عنوان IPv4 إلى عدد صحيح

def ip_to_int(ip_address):
    """
    Convertit une adresse IPv4 en entier 32 bits.
    
    Args:
        ip_address (str): Adresse IPv4 au format '192.168.1.1'
        
    Returns:
        int: Représentation entière de l'adresse IPv4
    """
    octets = ip_address.split('.')
    
    # Vérification de la validité de l'adresse IP
    if len(octets) != 4:
        raise ValueError("Format d'adresse IPv4 invalide")
    
    # Conversion des octets en entiers et vérification des plages
    octets_int = []
    for octet in octets:
        o = int(octet)
        if o < 0 or o > 255:
            raise ValueError(f"Valeur d'octet invalide: {o}")
        octets_int.append(o)
    
    # Calcul de l'entier final
    return (octets_int[0] << 24) | (octets_int[1] << 16) | (octets_int[2] << 8) | octets_int[3]

تحويل عدد صحيح إلى عنوان IPv4

def int_to_ip(ip_int):
    """
    Convertit un entier 32 bits en adresse IPv4.
    
    Args:
        ip_int (int): Entier 32 bits représentant une adresse IPv4
        
    Returns:
        str: Adresse IPv4 au format '192.168.1.1'
    """
    # Vérification de la plage valide pour une adresse IPv4
    if ip_int < 0 or ip_int > 4294967295:  # 2^32 - 1
        raise ValueError("L'entier doit être compris entre 0 et 2^32 - 1")
    
    # Extraction des octets
    octet1 = (ip_int >> 24) & 255
    octet2 = (ip_int >> 16) & 255
    octet3 = (ip_int >> 8) & 255
    octet4 = ip_int & 255
    
    # Construction de l'adresse IP
    return f"{octet1}.{octet2}.{octet3}.{octet4}"

أمثلة على الاستخدام

فيما يلي بعض الأمثلة لتوضيح استخدام هذه الدوال:

# Conversion IP vers entier
print(ip_to_int("192.168.1.1"))  # Output: 3232235777
print(ip_to_int("127.0.0.1"))    # Output: 2130706433
print(ip_to_int("10.0.0.1"))     # Output: 167772161

# Conversion entier vers IP
print(int_to_ip(3232235777))     # Output: 192.168.1.1
print(int_to_ip(2130706433))     # Output: 127.0.0.1
print(int_to_ip(167772161))      # Output: 10.0.0.1

استخدام المكتبة القياسية

توفّر Python أيضًا حلًا عبر المكتبة القياسية socket لإجراء هذه التحويلات:

import socket
import struct

# Conversion IP vers entier
def ip_to_int_socket(ip_address):
    return struct.unpack('!I', socket.inet_aton(ip_address))[0]

# Conversion entier vers IP
def int_to_ip_socket(ip_int):
    return socket.inet_ntoa(struct.pack('!I', ip_int))

# Exemples
print(ip_to_int_socket("192.168.1.1"))  # Output: 3232235777
print(int_to_ip_socket(3232235777))     # Output: 192.168.1.1

هذا الأسلوب أكثر إيجازًا ويتولّى تلقائيًا التحقق من صحة عناوين IP.

التطبيقات العملية

1. التحقق من الانتماء إلى شبكة فرعية

def is_in_subnet(ip, subnet, mask):
    """
    Vérifie si une adresse IP appartient à un sous-réseau.
    
    Args:
        ip (str): Adresse IP à vérifier
        subnet (str): Adresse du sous-réseau
        mask (int): Masque de sous-réseau en notation CIDR (ex: 24 pour /24)
    
    Returns:
        bool: True si l'IP appartient au sous-réseau, False sinon
    """
    ip_int = ip_to_int(ip)
    subnet_int = ip_to_int(subnet)
    
    # Création du masque binaire
    cidr_mask = (0xFFFFFFFF << (32 - mask)) & 0xFFFFFFFF
    
    # Comparaison des réseaux
    return (ip_int & cidr_mask) == (subnet_int & cidr_mask)

# Exemple
print(is_in_subnet("192.168.1.5", "192.168.1.0", 24))  # Output: True
print(is_in_subnet("192.168.2.1", "192.168.1.0", 24))  # Output: False

2. التكرار على كتلة من عناوين IP

def ip_range(start_ip, end_ip):
    """
    Génère toutes les adresses IP dans une plage donnée.
    
    Args:
        start_ip (str): Adresse IP de début
        end_ip (str): Adresse IP de fin
    
    Yields:
        str: Adresses IP de la plage
    """
    start_int = ip_to_int(start_ip)
    end_int = ip_to_int(end_ip)
    
    if start_int > end_int:
        raise ValueError("L'adresse IP de début doit être inférieure à l'adresse IP de fin")
    
    for ip_int in range(start_int, end_int + 1):
        yield int_to_ip(ip_int)

# Exemple
for ip in ip_range("192.168.1.1", "192.168.1.5"):
    print(ip)
# Output:
# 192.168.1.1
# 192.168.1.2
# 192.168.1.3
# 192.168.1.4
# 192.168.1.5

الأداء والتحسينات

بالنسبة للتطبيقات التي تتطلب عددًا كبيرًا من التحويلات، يمكن تحسين الدوال:

# Version optimisée sans validation
def ip_to_int_fast(ip_address):
    a, b, c, d = map(int, ip_address.split('.'))
    return (a << 24) | (b << 16) | (c << 8) | d

def int_to_ip_fast(ip_int):
    return f"{(ip_int >> 24) & 255}.{(ip_int >> 16) & 255}.{(ip_int >> 8) & 255}.{ip_int & 255}"

تضحّي هذه النسخ بالتحقق من الصحة لصالح الأداء، لذلك ينبغي استخدامها فقط في السياقات التي تكون فيها المدخلات قد جرى التحقق منها مسبقًا.

الخاتمة

يُعدّ التحويل بين عناوين IPv4 والأعداد الصحيحة ذات 32 بت عملية أساسية في العديد من المجالات المتعلقة بشبكات الحاسوب. وتوفّر Python عدة طرق لإجراء هذه التحويلات، بدءًا من التنفيذ اليدوي وصولًا إلى استخدام المكتبة القياسية.

يمكن دمج هذه الدوال في أدوات شبكية متنوعة مثل:

  • ماسحات الشبكة
  • أدوات تحليل السجلات
  • أنظمة كشف التسلل
  • تطبيقات مراقبة الشبكة

وبإتقانك لهذه التحويلات، تمتلك مهارة أساسية لتطوير تطبيقات الشبكات باستخدام Python.

InSkillCoach

نبذة عن InSkillCoach

خبير في التدريب والتقنيات

مدرّب متخصص في التقنيات المتقدمة والذكاء الاصطناعي، تدعمه شركة GNeurone Inc.

الشهادات:

  • AWS Certified Solutions Architect – Professional
  • شهادات Google Cloud
  • Microsoft Certified: DevOps Engineer Expert
  • Certified Kubernetes Administrator (CKA)
  • CompTIA Security+
1.5k
196

التعليقات

التعليقات مدعومة عبر GitHub Discussions

سجّل الدخول باستخدام GitHub للمشاركة في النقاش

تم نسخ الرابط!