Objective-C Преобразование целого числа в шестнадцатеричное значение

У меня есть словарь, инициализированный так...

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

где keys является NSArray алфавита и других символов, а values является NSArray of unsigned char s, которые являются шестыми ключами USB для этих символов.

Коды USB-ключей представляют собой шестнадцатеричные значения, которые варьируются от 0x04 до 0xE7. Я пытаюсь создать карту между этими двумя в зависимости от того, какая клавиша нажата на клавиатуре.

Массив values создается таким образом...

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

Так идеально, когда я запускаю этот код... где character == @"I"

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

    return (uint8)[val unsignedCharValue];
}

Я ожидал бы вернуться 0x0C, но я получаю 12 назад как int (который после того, как я подумал об этом, имеет смысл). Мне нужно сохранить шестнадцатеричное значение. Мне не нужно строковое значение. Мне нужно прямое преобразование в шестнадцатеричное значение или лучший способ хранения

uint8 - это просто typedef unsigned char.

РЕДАКТИРОВАТЬ Я был неясно, когда я разместил это раньше. Вот что мне нужно.

Мне нужно шестнадцатеричное значение этих кодов, потому что они отправляются по внутренней сети компании. Кроме того, значение нажатой клавиши преобразуется из большого эндиана (или немного, оно ускользает от меня прямо сейчас, какое оно есть) к другому, а затем передается по внутренней сети. Я понимаю, что эти значения хранятся в двоичном формате, но мне нужно передать их в шестнадцатеричном формате.

Кроме того, я заявил, что получаю 12 от функции. Я читал 12 из отладчика, а не получал значение. Возможно, поэтому я сбился с толку.

Ответ 1

12 (в базе 10) равен 0x0c.

Если вы хотите распечатать его в шестнадцатеричном формате, используйте спецификатор формата %x, например.

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

Если вы хотите увидеть его в шестнадцатеричном формате в отладчике (предположив Xcode 3.2.x), щелкните правой кнопкой мыши на переменной и выберите шестнадцатеричный формат.

Ответ 2

Вы знаете, что int хранится в двоичном формате (т.е. значение "hex" всегда и никогда не сохраняется), поэтому я интерпретирую ваш вопрос как относящийся к печати на экране.
Вы можете использовать спецификатор формата для чего-то вроде %0x.

Ответ 3

Значение, возвращаемое с вашего метода -getUSBCode: не два десятичных числа, это один восьмибитовый бит. Оба "12" и "0x0C" представляют собой строки, которые представляют это байтовое значение, поэтому вы хотите "0x0C", но не хотите, чтобы строка была противоречием.