الثعبان: التعبئة عنوان الملكية الفكرية باعتبارها ctype.c_ulong () للاستخدام مع DLL
-
11-07-2019 - |
سؤال
ونظرا لالبرمجية التالية:
import ctypes
ip="192.168.1.1"
thisdll = ctypes.cdll['aDLL']
thisdll.functionThatExpectsAnIP(ip)
وكيف يمكنني بشكل صحيح حزمة هذا لDLL التي تتوقع أنها نوع البيانات c_ulong؟
ولقد حاولت استخدام:
ip_netFrmt = socket.inet_aton(ip)
ip_netFrmt_c = ctypes.c_ulong(ip_netFrmt)
ولكن، الأسلوب c_ulong()
بإرجاع خطأ لأنه يحتاج إلى عدد صحيح.
وهناك طريقة لاستخدام struct.pack
لتحقيق ذلك؟
المحلول
ووinet_aton بإرجاع سلسلة من وحدات البايت. يستخدم هذا أن يكون <م> لغة مشتركة م> لواجهات C-لغة.
وفيما يلي كيفية فك تلك بايت إلى قيمة أكثر فائدة.
>>> import socket
>>> packed_n= socket.inet_aton("128.0.0.1")
>>> import struct
>>> struct.unpack( "!L", packed_n )
(2147483649L,)
>>> hex(_[0])
'0x80000001L'
ويمكن استخدام هذه القيمة تفكيك مع ctypes. الشيء عرافة هو فقط لتظهر لك أن القيمة تفكيك يتطلع الكثير مثل عنوان IP.
نصائح أخرى
والأولى التنصل: هذا مجرد تخمين
ويمثل وسيلة معالجة الملكية الفكرية تقليديا إلى أربعة بايت - أي xxx.xxx.xxx.xxx، ولكن هو في الحقيقة غير موقعة طويلة. لذا يجب عليك تحويل 192.168.1.1 التمثيل إلى int unsiged. هل يمكن تحويله من هذا القبيل.
ip="192.168.1.1"
ip_long = reduce(lambda x,y:x*256+int(y), ip.split('.'), 0)
وهناك ربما بطريقة أفضل، ولكن هذا يعمل:
>>> ip = "192.168.1.1"
>>> struct.unpack('>I', struct.pack('BBBB', *map(int, ip.split('.'))))[0]
3232235777L
لطريقة أكثر دقة من التعامل مع البرامج المتكاملة (V6، على غرار CIDR الاشياء الخ) تحقق من كيف يتم ذلك في <لأ href = "http://www.mindrot.org/projects/py-radix/" يختلط = "نوفولو noreferrer"> الحمر-الجذر ، وإسبانيا. prefix_pton .