الثعبان: التعبئة عنوان الملكية الفكرية باعتبارها ctype.c_ulong () للاستخدام مع DLL

StackOverflow https://stackoverflow.com/questions/317531

  •  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 .

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top