2011-03-29 4 views
11

J'ai un dictionnaire initialisé comme si ...Objective-C Conversion d'un nombre entier d'une valeur hexadécimale

keyDictionary = [[NSDictionary dictionaryWithObjects:values forKeys:keys]retain]; 

keys est un NSArray de l'alphabet et d'autres caractères et values est un NSArray de unsigned char s, qui sont les codes clés hexadécimaux USB pour ces caractères.

Les codes de clé USB sont des valeurs hexadécimales comprises entre 0x04 et 0xE7. J'essaye de créer une carte entre ces deux selon quelle clef est pressée sur le clavier.

Le tableau values est créé comme si ...

NSArray *values = [NSArray arrayWithObjects: 
        [NSNumber numberWithUnsignedChar:0x04]/*A*/, 
        [NSNumber numberWithUnsignedChar:0x05]/*B*/, /*ETC*/]; 

Donc, idéalement quand je lance ce code ... où character == @"I"

- (uint8) getUSBCode:(NSString *)character 
{ 
    NSNumber *val = [keyDictionary objectForKey:character]; 

    return (uint8)[val unsignedCharValue]; 
} 

j'attendre de revenir 0x0C, mais Je récupère 12 comme un int (qui après y avoir pensé, a un sens). J'ai besoin de la valeur hexadécimale conservée. Je n'ai pas besoin d'une valeur de chaîne. J'ai besoin d'une conversion directe à la valeur hexadécimale ou une meilleure façon de stocker

uint8 est juste un typedef unsigned char.

EDIT Je n'étais pas clair quand j'ai posté cela plus tôt. Voici ce dont j'ai besoin.

J'ai besoin de la valeur hexadécimale de ces codes car ils sont envoyés via le réseau interne de l'entreprise. De plus, la valeur de la touche pressée est en train d'être convertie en big endian (ou peu, elle m'échappe en ce moment) et à l'autre, puis est transmise sur un réseau interne. Je comprends que ces valeurs sont stockées en binaire, mais j'ai besoin de les transmettre en hexadécimal.

En outre, j'ai déclaré que je récupérais 12 de la fonction. Je lisais 12 du débogueur, n'obtenant pas réellement la valeur. C'est peut-être pourquoi je devenais confus.

+1

12 décimales et 0x0C sont le même nombre. Vous pouvez essayer de comparer la valeur de retour avec 0x0C et voir si elles sont identiques.c'est-à-dire 'if (retval == 0x0c) NSLog (@" Ils sont identiques "); sinon NSLog (@ "Ils ne sont pas les mêmes"); 'Les bits transmis par le port série USB seront les mêmes avec le décimal 12 ou hex C: ... 00001100 –

+0

Vous avez tous techniquement raison. J'étais un crétin total quand j'ai demandé cela. Pour une raison quelconque, j'ai supposé que je devais envoyer les codes en hexadécimal, mais à la fin, nous envoyons essentiellement des binaires. – DavidAndroidDev

Répondre

46

12 (en base 10) est 0x0c.

Si vous souhaitez l'imprimer en hexadécimal, utilisez le spécificateur de format %x, par ex.

NSLog(@"Hex value of char is 0x%02x", (unsigned int) c); 

Si vous voulez voir dans l'hexagone dans le débogueur (en supposant 3.2.x Xcode) un clic droit sur la variable et sélectionnez hexadécimal comme format.

0

Vous savez qu'un int est stocké en binaire (c'est-à-dire que la valeur 'hex' est toujours et jamais conservée), donc j'interprète votre question en ce qui concerne l'impression à l'écran.
Vous devriez être en mesure d'utiliser un format specifier pour cela - quelque chose comme %0x.

0

La valeur renvoyée par votre méthode -getUSBCode: n'est pas deux chiffres décimaux, c'est un octet de huit bits. "12" et "0x0C" sont des chaînes qui représentent la valeur de cet octet, ce qui signifie que vous voulez "0x0C" mais ne voulez pas qu'une chaîne soit une contradiction.

+0

Vous avez raison. Je suppose que je n'étais pas très clair dans ma question. Je vais le modifier maintenant. – DavidAndroidDev

Questions connexes