Structure de donnée et NSData
Ceetix
Membre
Hello,
Voilà j'ai une petite question.
J'ai une structure de donnée :
J'aimerai mettre mes variables de ce type dans un NSData, je vois pas trop comment mettre une variable dedans.
J'ai fais ça :
Est-ce bien correcte ? Si oui comment le décrypter derrière ?
Car j'aimerai ensuite m'en servir pour envoyer cette donnée via wifi à l'autre device pour qu'il puisse décoder ça .
Voilà j'ai une petite question.
J'ai une structure de donnée :
<br />typedef struct Data{<br /> int idn;<br /> int msg;<br />}Data;<br />
J'aimerai mettre mes variables de ce type dans un NSData, je vois pas trop comment mettre une variable dedans.
J'ai fais ça :
<br />Data *aD;<br />aD->idn = message->idn;<br />aD->msg = message->msg;<br />NSData *data = [NSData dataWithBytes:&aD length:sizeof(Data *)];<br />
Est-ce bien correcte ? Si oui comment le décrypter derrière ?
Car j'aimerai ensuite m'en servir pour envoyer cette donnée via wifi à l'autre device pour qu'il puisse décoder ça .
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Le type "Data" n'est pas un NSObject comme des objets Cocoa, c'est une structure C ("struct"). Donc si tu déclares "Data*" tu déclares un pointeur vers une structure, mais il faut l'initialiser (avec malloc) et faudra penser à la relâcher (avec free), un peu comme tu ferais "alloc/init" et "release" avec un objet Cocoa. Et en plus c'est alors directement le pointeur qu'il faudra passer à dataWithBytes, au risque d'encoder le pointeur vers ton "Data" et non pas le contenu du "Data" lui-même, ce qui perd tout son intérêt...
Donc le plus simple est de ne pas manipuler des "Data*" mais juste des "Data" (puisque ce sont juste des struct C, comme tu manipulerais des int ou des float directement, quoi et pas des int* ou float*) :
Si c'est pour envoyer sur du réseau, NSData peut en effet être plus apporprié, fais juste gaffe à ce que les deux parties que tu vas faire communiquer utilisent la même endianness (LittleEndian/BigEndian). Si par exemple ce sont un MacIntel et un iPhone, c'est le cas, mais un Mac Intel et un Mac PPC ce n'est pas le cas.
Sinon, pour retransformer ton NSData en struct, il suffit de récupérer les octets encapsulés dans ce NSData, et de les caster en Data : ou plus directement
Merci beaucoup pour ces explications !
Je me demandais un truc aussi. Là je reçois avec mon mac mon Data, mais si je veux le recevoir avec un serveur windows, il ne pourra jamais décrypter mon Data que j'envoie vu que je le fais via NSData. Si ?
NSData est un objet Cocoa pour manipuler les flux d'octets, ce n'est qu'un objet bien pratique pour manipuler ces données.
Mais on ne peut pas dire que tu "envoies tes NSData dans le socket (sur le réseau)" : c'est juste que la méthode que tu utilises, pour envoyer tes données sur le réseau, prend j'imagine (je sais pas quelle méthode tu utilises en fait) un NSData en paramètre, parce que c'est quand même bien plus simple à manipuler pour toi que de manipuler des NSData dans des méthodes Cocoa quoi. Mais en réalité tu "envoies des octets dans le socket (sur le réseau)" donc les octets contenus dans ton NSData.
Tu utiliserais une autre API que Cocoa, par exemple les APIs C directement, tu manipulerais tes octets à envoyer sous forme de "char*" ou "void*", mais ça marcherait pareil.
Donc de l'autre côté, que tu aies un Mac, un Windows, un Linux, etc... ça change rien. Tu utilises l'API que tu veux, du moment qu'à un moment donné tu puisses récupérer tes octets (que l'API les encapsule dans un NSData ou un autre objet... ou pas).
Il y a aussi le problème d'Endianness.
D'habitude, on utilise plutôt un buffer dans lequel on sérialise les octets avant de l'envoyer sur le réseau.