كيفية قراءة نسخة مؤشرات / الأساسية CType في الدرجة الثعبان؟
سؤال
وهذا هو نوع من المتابعة من سؤالي الأخير إذا كان هذا يمكن أن تساعدك .
وأنا تحديد عدد قليل من الهياكل الأساسية 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 "") + ">"