Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

[ctypes] Comment remplacer c_char_p par POINTER(c_char) pour des données binaires

0 votes

Je dois passer des données à un programme en C par l'intermédiaire de la structure ci-après.

class ToxOptions(Structure):
_fields_ = [
    ('ipv6_enabled', c_bool),
    ('udp_enabled', c_bool),
    ('proxy_type', c_int),
    ('proxy_host', c_char_p),
    ('proxy_port', c_uint16),
    ('start_port', c_uint16),
    ('end_port', c_uint16),
    ('tcp_port', c_uint16),
    ('savedata_type', c_int),
    ('savedata_data', c_char_p),
    ('savedata_length', c_size_t)
]

Pour cela, j'utilise le bout de code suivant:

       # Load existing profil
        with open("tox.data", "rb") as f:
            self.__tox_data = f.read()
        __tox_options.contents.savedata_type = TOX_SAVEDATA_TYPE['TOX_SAVE']
        __tox_options.contents.savedata_data = c_char_p(self.__tox_data)
        __tox_options.contents.savedata_length = len(self.__tox_data)

Or, cela ne fonctionne pas car, comme expliqué dans la documentation, ccharp ne fonctionne qu'avec des chaînes de caractères se terminant par \0 et, justement, mes données binaires contiennent \0.

Je n'arrive pas à remplacer ccharp par POINTER(c_char) et ainsi passer self.__tox_data par référence au programme C.

demandé 12-Aou-2019 par Manu

Peux-tu fournir un exemple complet de fichier tox.data pour pouvoir tester ?

Se connecter ou S'inscrire pour répondre à cette question.

...