Conversions C->ObjC
soraya_soch
Membre
Bonjour, nouveau venu ici je me cogne la tête avec des problème de conversions...
Je pars d'un entier qui représente un decimal (et les bytes 0x780).
unsigned int monInt = 1920;
NSLog(@%i, monInt); //1920
NSLog(@%x, monInt); //780
J'essaye ensuite de le lire dans un object, et je pensais pouvoir le faire comme ceci:
NSString * test = [NSString stringWithFormat:@%i, monInt];
NSLog(@%x, test); //48893c0 <- c'est pas ça que je voulais...
NSLog(@%@", test); //1920
Je pensais recuperer la même valeur pour le hex dans le NSString mais non...
Est-ce un problème d'encoding?
Merci pour des lumières!
Je pars d'un entier qui représente un decimal (et les bytes 0x780).
unsigned int monInt = 1920;
NSLog(@%i, monInt); //1920
NSLog(@%x, monInt); //780
J'essaye ensuite de le lire dans un object, et je pensais pouvoir le faire comme ceci:
NSString * test = [NSString stringWithFormat:@%i, monInt];
NSLog(@%x, test); //48893c0 <- c'est pas ça que je voulais...
NSLog(@%@", test); //1920
Je pensais recuperer la même valeur pour le hex dans le NSString mais non...
Est-ce un problème d'encoding?
Merci pour des lumières!
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
La tu récupères l'adresse de la chaine de caractère test.
Le format pour unsigned int est %u
Ici il n'y a pas d'erreur car monInt est automatiquement transformé en int du fait du format %i
Là , la conversion n'est pas automatique. Utilises %u
Peux être que NSString est le mauvais object a utiliser...
Mon but est de creer un NSData contenant les bytes lus depuis la variable monInt.
En gros et en pseudocasicode:
unsigned int monInt = 1920;
NSData * toto = [NSData dataWithBytes:monInt length:sizeof(monInt)
afin de:
NSLog(@%@", toto) => < 0780 >
Le résultant s'ajouterait à un NSMutableData qui ne contient que de bytes...
Je m'explique très mal, ça fait quelques heures que je m'arrache les cheveux...et je vois trouble... :brule:
Sinon, il va aller chercher à l'adresse 1920 et ça risque de faire mal...
Ensuite, si c'est pour écrire dans un fichier ou envoyer sur un serveur, c'est une très mauvais technique car ce n'est pas "endian safe".
Après une foultitude de tests, voila: (Correction, erreur de transcodage...)
unsigned int i = 1920;
unsigned char maByteArray[2];
memcpy(maByteArray, (unsigned char *) &i, sizeof(maByteArray));
char shiftedByteArray = (maByteArray[0] >> 8) | (maByteArray[1]);
NSData * test = [NSData dataWithBytes:&shiftedByteArray length:sizeof(maByteArray)];
NSData * test = [NSData dataWithBytes:&shiftedByteArray length:sizeof(maByteArray)];
NSLog(@%@", test);
// <0780>
C'est risqué?
maByteArray et myByteArray, c'est pareil ?
Si oui, maByteArray[0] est un char... Donc déjà maByteArray[0]>>8 = 0
Si non, qu'est-ce que maByteArray ? et theByteArray ne sert à rien...
j'ai les yeux collés je crois... trop longtemps sur ce truc....
Merci pour l'aide en tout cas!
S.
maByteArray[0]>>8 ?? ( -> 0 )
Tu essaies de mettre l'une sur l'autre les 2 parties d'un u16 ?
Je récupère un flux NSData venant de celui-ci, et selon les differentes operations de l'utilisateur, des checksums sont calculés et maintenu sous la forme d'entier. Ces entiers sont convertis en NSData et réinsérés dans la chaine, avant de les envoyer sur l'appareil...
// i = 0x0780
unsigned char maByteArray[2];
memcpy(maByteArray, (unsigned char *) &i, sizeof(maByteArray));
// maByteArray[0] = 0x07 ; maByteArray[1] = 0x80 en Little Endian
// maByteArray[0] = 0X80 ; maByteArray[1] = 0X07 en Big Endian
char shiftedByteArray = (maByteArray[0] >> 8) | (maByteArray[1]);
// shiftedByteArray = 0x80 en Little Endian
// shiftedByteArray = 0x07 en Big Endian
// maByteArray[0]>>8 vaut 0 dans tous les cas !!
NSData * test = [NSData dataWithBytes:&shiftedByteArray length:sizeof(maByteArray)];
// Ouille ouille dépassement mémoire ; shiftedByteArray a une taille de 8 bits, maByteArray de 16 bits !!
NSData * test = [NSData dataWithBytes:&shiftedByteArray length:sizeof(maByteArray)];
// Doublon...
NSLog(@%@", test);
// <0780>
// Coup de pot, tu as un buffer overflow...