0

Python 2.7 で初めて ctypes を使用するのに少し問題があります。問題は次のとおりです。

  1. ネイティブ コードで関数を呼び出して、メモリを確保します。この関数は、バッファへのポインタを提供します。バッファーは、続行する前に ctypes 構造体にキャストされます。
  2. いくつかの構造体メンバーを割り当て、memmove を実行して必要なフィールドを埋めます。
  3. バッファーへのポインターは、ライブラリー内の別の関数に渡されます。

問題は、Python で行った変更が他の関数に反映されていないことです。Python インタープリターで gdb を使用してこれを確認しました。基本的に、私が実行した操作はどれも効果がないように見え、設定されるはずのフィールドはゼロであるか、データが含まれていませんでした。

ライブラリとやり取りする Python コードは次のとおりです。

pxCspPacket = ctypes.cast(                                  
        pycsp.csp_buffer_get(bytesToSend),          
        ctypes.POINTER(pycsp.csp_packet_t))

pxCspPacket.contents.length = bytesToSend
ctypes.memmove(pxCspPacket.contents.data,                   
        dataToSend,                                         
        bytesToSend)

# Send packet
pycsp.csp_send(conn, pxCspPacket, self.cspTimeout)

ライブラリへのバインディングは次のとおりです。

class csp_packet_t (ctypes.Structure):
        _pack_ = 1
        _fields_ = [("padding", ctypes.c_uint8 * 46),
            ("length", ctypes.c_uint16),
            ("id", csp_id_t),
            ("data", ctypes.c_uint8 * 256)]

C の構造体の対応する定義:

typedef struct __attribute__((__packed__)) {
        uint8_t padding[CSP_PADDING_BYTES]; 
        uint16_t length;
        csp_id_t id;
        union {
                uint8_t data[0];
                uint16_t data16[0];
                uint32_t data32[0];
        };
} csp_packet_t;

助けてくれてありがとう!

4

1 に答える 1