Conversions C->ObjC

soraya_sochsoraya_soch Membre
11:11 modifié dans API AppKit #1
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!

Réponses

  • GGGG Membre
    11:11 modifié #2
    dans 1228762879:

    NSLog(@%x, test);  //48893c0 <- c'est pas ça que je voulais...
    NSLog(@%@", test); //1920



    La tu récupères l'adresse de la chaine de caractère test.


  • Philippe49Philippe49 Membre
    11:11 modifié #3
    dans 1228762879:

    unsigned int monInt = 1920;
    NSLog(@%i, monInt);   //1920
    NSLog(@%x, monInt);  //780

    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

    dans 1228762879:

    J'essaye ensuite de le lire dans un object, et je pensais pouvoir le faire comme ceci
    NSString * test = [NSString stringWithFormat:@%i, monInt];

    Là , la conversion n'est pas automatique. Utilises %u
  • soraya_sochsoraya_soch Membre
    11:11 modifié #4
    Je m'y perd... et je m'y prend comme un manche  :'(

    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:
  • schlumschlum Membre
    11:11 modifié #5
    Déjà , ça serait "dataWithBytes:&monInt"
    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".
  • soraya_sochsoraya_soch Membre
    décembre 2008 modifié #6
    En fait l'endianness n'est pas trop grave (hopefully), le résultant est envoyé par le port série à  un appareil (toujours le même).

    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é?
  • schlumschlum Membre
    décembre 2008 modifié #7
    Je ne comprends pas ce que tu veux faire...

    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...
  • soraya_sochsoraya_soch Membre
    11:11 modifié #8
    :) mdr

    j'ai les yeux collés je crois... trop longtemps sur ce truc....

    Merci pour l'aide en tout cas!

    S.
  • schlumschlum Membre
    11:11 modifié #9
    maByteArray c'est un tableau de char alors ?
    maByteArray[0]>>8 ?? ( -> 0 )

    Tu essaies de mettre l'une sur l'autre les 2 parties d'un u16 ?
  • soraya_sochsoraya_soch Membre
    11:11 modifié #10
    Le but était de générer dynamique une "requête" qui sera envoyé à  un appareil externe (port série).

    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...

  • schlumschlum Membre
    11:11 modifié #11
    unsigned int i = 1920; 
    // 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...
Connectez-vous ou Inscrivez-vous pour répondre.