2010-07-13 5 views
2

J'ai des difficultés à communiquer les coordonnées de position à un ensemble de moteurs que j'ai connectés sur le réseau. Je peux envoyer une chaîne très bien, et recevoir du texte du moteur, mais je n'arrive pas à lui envoyer une valeur int. Utilisation de NSlog J'ai déterminé que la valeur réelle que j'envoie est correcte, mais je suppose que ma méthode d'envoi via le flux de sortie est incorrecte. Des idées?Ecriture d'une valeur de 64 bits int sur NSOutputStream

Mon code pour envoyer une valeur 64bit int:

uint64_t rawInt = m1; 
rawInt <<= 16; 
rawInt |= m2; 
NSData *buffer = [NSData dataWithBytes: &rawInt length:8]; 
[outputStream write: [buffer bytes] maxLength:[buffer length]]; 

Répondre

7

Eh bien, vos codes semblent plutôt amusants. Quoi qu'il en soit, pour envoyer un entier binaire sur le réseau, vous devez connaître l'endianess: Le récepteur s'attend à des entiers petits ou gros.

est ici le code pour les deux:

uint64_t myInt = 42; 

uint64_t netInt = CFSwapInt64HostToLittle(myInt); // use this for little endian 
uint64_t netInt = CFSwapInt64HostToBig(myInt); // use this for big endian 

[outputStream write:(uint8_t*)&netInt maxLength:sizeof(netInt)]; 
+0

Le code ci-dessus donne l'avertissement: "avertissement: Argument 1 passant de 'écriture: maxLength:' de type pointeur incompatible". – isometrik

+0

Malgré l'avertissement, le code fonctionne. Mon endianess était le contraire de ce qu'il devrait être. Merci! – isometrik

+0

Cast supplémentaire pour supprimer l'avertissement. –

1

Vous voyez probablement un problème de boutisme. Les processeurs Intel sont little-endian, ce qui signifie que l'octet le moins significatif d'une valeur multi-octets est stocké en premier, l'octet le plus significatif en dernier. Lire un numéro de 8 octets dans la mémoire et le mettre sur le réseau sans rien faire provoquera l'extinction des octets dans cet ordre.

La plupart des protocoles réseau (y compris tous les protocoles Internet) attendent big-endian données, de sorte que l'octet le plus significatif apparaît sur le réseau et premier octet le moins significatif dernier. Est-ce que votre protocole réseau l'attend?