كيفية قراءة نسخة مؤشرات / الأساسية CType في الدرجة الثعبان؟

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

سؤال

وهذا هو نوع من المتابعة من سؤالي الأخير إذا كان هذا يمكن أن تساعدك .

وأنا تحديد عدد قليل من الهياكل الأساسية CType

class EthercatDatagram(Structure):
    _fields_ = [("header", EthercatDatagramHeader),
                ("packet_data_length", c_int),
                ("packet_data", POINTER(c_ubyte)),
                ("work_count", c_ushort)]

class EthercatPacket(Structure):
    _fields_ = [("ether_header", ETH_HEADER),
                ("Ethercat_header", EthercatHeader),
                ("data", POINTER(EthercatDatagram))]

وعلما بأن هذا يتم تحليل بشكل صحيح من قبل الثعبان، يتم تعريف الطبقات المفقودة في مكان آخر. مشكلتي هي عندما أعطى التعليمات البرمجية التالية

packet = EthercatPacket()
ethercap.RecvPacket(byref(packet))
print packet.data.header

وهذا غير صحيح. كما فهمت المشكلة، البيانات هو نوع من المؤشر حتى لا يكون (حقا) تعيين لEthercatDatagram، وبالتالي، فإن المحلل لا يعرف حقل رأس الأساسي.

وهناك بعض طريقة لقراءة هذا المجال وكذلك في أي ميدان آخر يمثله POINTER ()؟

هل كانت مفيدة؟

المحلول 2

وطيب حصلت عليه العمل

وكان الرمز الصحيح

print packet.data.header[0]

وبفضل الشخص الذي تجرأ 7 للنظر في مسألة

وسلسلة جوجل لكان الجواب: الأساسية CType بيثون dereference المؤشر ضرب 3RD

نصائح أخرى

والتدوين ساحة قوس هو الصحيح في الواقع. للإشارة، وهنا مقتطف من بعض رمز ctypes أنا مؤخرا جعلت:

class Message(Structure):
    _fields_ = [ ("id", BYTE), ("data", POINTER(BYTE)), ("data_length", DWORD) ]
    def __repr__(self):
        d = ' '.join(["0x%02X" % self.data[i] for i in range(self.data_length)])
        return "<Message: id = 0x%02X, " % (self.id) + "data_length = " + str(self.data_length) + (self.data_length > 0 and (", data: " + d) or "") + ">"
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top