2010-02-22 5 views
2

Je travaille avec des sockets et essaye d'écrire simplement une chaîne dans le socket. J'ai trouvé quelques exemples sur la façon de le faire, comme dans l'exemple suivant (oStream est un NSOutputStream). Tout cela est dans le NSStreamEventHasSpaceAvailable.Mettre NSString dans le tampon uint8_t

uint8_t buffer[11] = "I send this";    
int len; 
len = [oStream write:buffer maxLength:sizeof(buffer)]; 

Cela fonctionne très bien. J'ai donc essayé de le modifier pour le rendre personnalisable en obtenant les octets d'un NSString.

int len; 
NSString* strId; 
strId = @"string will be customized with several lines of code here"; 

uint8_t buffer[[strId lengthOfBytesUsingEncoding:NSASCIIStringEncoding]];      
[strId getBytes:buffer maxLength:sizeof(buffer) usedLength:NULL encoding:NSASCIIStringEncoding options:NULL range:NSRangeFromString(strId) remainingRange:NULL]; 
len = [oStream write:buffer maxLength:sizeof(buffer)]; 

Ceci ne fonctionne pas du tout. Il écrit le charabia complet dans le tampon (probablement les octets) et j'obtiens un avertissement pour la ligne getBytes de "passer l'argument 5 de getBytes fait l'entier du pointeur sans un cast."

Désolé si cela a été demandé auparavant, n'a pas pu trouver une réponse de la recherche et il semblait que le problème devrait être très simple à résoudre. Merci!

EDIT: J'ai trouvé quelque chose qui semble fonctionner, mais je ne suis pas sûr que ce soit une bonne programmation de quelque chose comme ça. S'il vous plaît voir la réponse ci-dessous. Est-ce un code dangereux à utiliser dans cette situation?

+0

L'argument 5 concerne la façon dont 'options' devrait être un entier (en fait un membre de l'énumération' NSStringEncodingConversionOptions', ou une combinaison de membres de cette énumération) et vous passez NULL, qui se développe en '(void *) 0'. Passez-le à zéro pour fermer l'avertissement. (Cela ne résoudra pas votre problème si.) – zneak

+0

Merci zneak. Cela s'est débarrassé de l'avertissement, mais comme vous l'avez dit n'a pas résolu le problème réel. C'est un pas en avant cependant :) – mjdth

Répondre

3
+0

C'est parce que vous ne pouvez pas définir une taille de tableau dynamique en C, et Objective-C, en plus de ses règles spécifiques, fonctionne sous les règles C. Cela étant dit, cStringUsingEncoding ne nécessite pas de créer un tableau. Il renvoie un 'const char *', donc tout ce que vous devez déclarer est un 'const char *' pour recevoir le résultat: 'const char * buffer = [strId cStringUsingEncoding: NSASCIIStringEncoding];' Vous pouvez ensuite l'utiliser comme un array (sauf que vous ne pouvez pas utiliser 'sizeof'). – zneak

3

Après plus de recherche que j'ai trouvé que cela semble fonctionner:

len = [oStream write:[[strId dataUsingEncoding:NSASCIIStringEncoding] bytes] maxLength:[strId lengthOfBytesUsingEncoding:NSASCIIStringEncoding]]; 

Je me sens comme si ce n'est pas très sûr car il est en utilisant deux différentes façons d'obtenir les données dans le NSOutputStream ainsi que la durée. Y a-t-il un problème à le faire comme ça?

+0

Ce fut la méthode que j'ai fini par utiliser, mais je vais marquer l'autre comme la bonne réponse parce que cela fonctionne aussi bien. – mjdth