Objective-C Преобразование целого числа в шестнадцатеричное значение - PullRequest
14 голосов
/ 29 марта 2011

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

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

, где keys - это NSArray алфавита и других символов, а values - это NSArray из 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.

EDIT Я не понял, когдаопубликовал это ранее.Вот что мне нужно.

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

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

Ответы [ 3 ]

49 голосов
/ 29 марта 2011

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

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

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

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

0 голосов
/ 29 марта 2011

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

0 голосов
/ 29 марта 2011

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

...