2009-08-04 8 views
2

これはあなたに役立つ場合、my last questionからの一種のフォローアップです。これはPythonで正しく解析され、不足しているクラスが別の場所で定義されていることをctypeポインタをPythonクラスに読み書きするには?

私は

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))] 

少数のctype構造を定義しています注意してください。私はこれは間違ってい

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

次のコードを呼び出すとき 私の問題はあります。私がこの問題を理解しているように、データはある種のポインタなので、EthercatDatagramにマッピングされていないので、パーサーは元のヘッダーフィールドを認識しません。

POINTER()で表される他のフィールドと同様に、そのフィールドを読み取る方法がありますか? pythonのctype間接参照:私はそれが

正しいコードを働いてしまった

答えて

0

OK]をクリックして、質問

での回答のためのGoogleの文字列を探すためにあえて7人に

print packet.data.header[0] 

おかげでしたポインタ 第3ヒット

+0

私はこれまでにStackoverflowでこの質問に答えました。 – Unknown

1

実際には正方形の表記が正しいです。参考までに、私は最近作成したコードの一部を抜粋しています:

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 "") + ">" 
関連する問題