Je passe avec succès un nombre de 64 bits d'un client objC à un client java, mais je suis incapable d'envoyer à un client objC. Code /* * Récupère un numéro double (64 bits) du flux. */ double getDouble() privé lance IOException { octet [] buffer = getBytes (8);ObjC obtient le numéro de 64 bits du flux
long bits =
((long)buffer[0] & 0x0ff) |
(((long)buffer[1] & 0x0ff) << 8) |
(((long)buffer[2] & 0x0ff) << 16) |
(((long)buffer[3] & 0x0ff) << 24) |
(((long)buffer[4] & 0x0ff) << 32) |
(((long)buffer[5] & 0x0ff) << 40) |
(((long)buffer[6] & 0x0ff) << 48) |
(((long)buffer[7] & 0x0ff) << 56);
return Double.longBitsToDouble(bits);
}
Code objc
/*
* Retrieve a double (64-bit) number from the stream.
*/
- (double)getDouble
{
NSRange dblRange = NSMakeRange(0, 8);
char buffer[8];
[stream getBytes:buffer length:8];
[stream replaceBytesInRange:dblRange withBytes:NULL length:0];
long long bits =
((long long)buffer[0] & 0x0ff) |
(((long long)buffer[1] & 0x0ff) << 8) |
(((long long)buffer[2] & 0x0ff) << 16) |
(((long long)buffer[3] & 0x0ff) << 24) |
(((long long)buffer[4] & 0x0ff) << 32) |
(((long long)buffer[5] & 0x0ff) << 40) |
(((long long)buffer[6] & 0x0ff) << 48) |
(((long long)buffer[7] & 0x0ff) << 56);
NSNumber *tempNum = [NSNumber numberWithLongLong:bits];
NSLog(@"\n***********\nsizeof long long %d \n tempNum: %@\nbits %lld",sizeof(long long), tempNum, bits);
return [tempNum doubleValue];
}
le résultat de NSLog est
sizeof long long 8 tempNum: -4616134021117358511 bits de -4616134021117358511
le nombre doit être: -1.Le problème est que j'essaie de convertir Java en objC dans la fonction getDouble. Mon middleware prend en compte les problèmes endian. La solution est simple si la cible est peu endian
- (double)getDouble
NSRange dblRange = NSMakeRange(0, 8);
double swapped;
[stream getBytes:&swapped length:8];
[stream replaceBytesInRange:dblRange withBytes:NULL length:0];
return swapped;
Merci à tous pour l'entrée - ont obtenu beaucoup d'expérience et un peu de compréhension de cet exercice.
Je vais vous donner celui-ci. :) – Wevah
Eh bien, l'ordre des octets est juste une situation difficile à essayer et à déboguer de l'autre côté de la situation. :) – Ryan
double myDouble = CFConvertFloat64SwappedToHost (tampon (double)); xCode indique la valeur du pointeur utilisée lorsqu'un point flottant était attendu –