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.