2011-03-29 13 views
11

Tengo un diccionario inicializado como tal ...Objective-C en la conversión de un entero con un valor hexadecimal

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

donde keys es un NSArray del alfabeto y otros personajes y values es un NSArray de unsigned char s, que son los códigos llaves hexagonales USB para esos caracteres.

Los códigos de la llave USB son valores hexadecimales que van desde 0x04 a 0xE7. Intento crear un mapa entre estos dos dependiendo de qué tecla se presione en el teclado.

La matriz values se crea como tal ...

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

Así que lo ideal cuando corro el código ... donde character == @"I"

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

    return (uint8)[val unsignedCharValue]; 
} 

que se puede esperar para volver 0x0C, pero Obtendré 12 de vuelta como int (que después de pensarlo, tiene sentido). Necesito el valor hexadecimal preservado. NO necesito un valor de cadena. Necesito una conversión directa al valor hexadecimal o una forma mejor de almacenar

uint8 es simplemente un typedef char sin signo.

EDIT No estaba claro cuando publiqué esto antes. Esto es lo que necesito.

Necesito el valor hexadecimal de estos códigos porque se envían a través de la red interna de la compañía. Además, el valor de la tecla presionada se está convirtiendo de big endian (o poco, me está escapando, cuál es) a la otra, y luego se transmite a través de una red interna. Entiendo que estos valores se almacenan en binario, pero necesito transmitirlos en hexadecimal.

También, dije que estaba obteniendo 12 de vuelta de la función. Estaba leyendo 12 del depurador, no obteniendo realmente el valor. Esa podría ser la razón por la que me estaba confundiendo.

+1

12 decimal y 0x0C son el mismo número. Podría intentar comparar el valor de retorno con 0x0C y ver si son iguales.es decir 'if (retval == 0x0c) NSLog (@" They are the same "); de lo contrario, NSLog (@ "No son lo mismo"); 'Los bits que pasan por la tubería serial USB serán los mismos con decimal 12 o hexadecimal C: ... 00001100 –

+0

Todo está técnicamente correcto. Estaba siendo un idiota total cuando le pregunté esto. Por alguna razón, asumí que tenía que enviar los códigos como hex, pero al final, básicamente estamos enviando binarios. – DavidAndroidDev

Respuesta

46

12 (en la base 10) es 0x0c.

Si desea imprimirlo en hexadecimal, utilice el especificador de formato %x, p.

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

Si desea verlo en hexadecimal en el depurador (suponiendo 3.2.x Xcode) haga clic derecho en la variable y seleccione hexadecimal como el formato.

0

Sabe que una int se almacena en formato binario (es decir, el valor 'hexadecimal' está siempre y nunca se conserva), así que interpreto su pregunta como perteneciente a la impresión en la pantalla.
Debería poder usar un format specifier para eso - algo así como %0x.

0

El valor que devuelve su método -getUSBCode: no es dos dígitos decimales, es un byte de ocho bits. Tanto "12" y "0x0C" son cadenas que representan el valor de ese byte, por lo que decir que quieres "0x0C" pero no quieres una cadena es una contradicción.

+0

Estás en lo correcto. Supongo que no estaba muy claro en mi pregunta. Voy a editarlo ahora. – DavidAndroidDev

Cuestiones relacionadas