Как напечатать беззнаковый символ* в NSLog()

Название в значительной степени говорит все.

хотел бы напечатать (НЕ в десятичном виде), а в беззнаковом символьном значении (HEX). пример

unsigned char data[6] = {70,AF,80,1A, 01,7E};
NSLog(@"?",data); //need this output : 70 AF 80 1A 01 7E

Есть идеи? Заранее спасибо.


person HelmiB    schedule 23.11.2012    source источник
comment
Используйте printf и цикл for: stackoverflow.com/questions/6357031/   -  person Richard J. Ross III    schedule 23.11.2012
comment
Я думаю, вам придется сделать @"%02X %@02X %@02X ...", (unsigned int)data[0], (unsigned int)data[1], ...   -  person Hot Licks    schedule 23.11.2012


Ответы (3)


Для массива char нет спецификатора формата. Одним из вариантов было бы создать объект NSData из массива, а затем зарегистрировать объект NSData.

NSData *dataData = [NSData dataWithBytes:data length:sizeof(data)];
NSLog(@"data = %@", dataData);
person rmaddy    schedule 23.11.2012
comment
Что ж, для массива символов существует спецификатор формата — s — но он ожидает строку с завершающим нулем и печатает как символы ASCII, а не шестнадцатеричные. - person Hot Licks; 23.11.2012
comment
@HotLicks Вот почему я не упомянул %s, потому что мы не имеем дело с массивом char с нулевым завершением, а желаемый результат сильно отличается от того, что обеспечивает %s. - person rmaddy; 23.11.2012
comment
не по теме, но как просто напечатать unsigned char? не массив. - person HelmiB; 23.11.2012
comment
%c для беззнакового символа. Поднимите документы для NSString stringWithFormat:. Затем щелкните ссылку для спецификаторов формата строк. Но %c напечатает символ, а не шестнадцатеричное значение. - person rmaddy; 23.11.2012
comment
если хотите напечатать шестнадцатеричный, используйте %x не так ли? - person HelmiB; 23.11.2012
comment
Да, посмотрите, что @HotLicks написал в своем комментарии к вашему вопросу. %02X предлагает напечатать шестнадцатеричный код (X) шириной два и дополнить слева нулями по мере необходимости. - person rmaddy; 23.11.2012
comment
Могу ли я сохранить его в NSString с помощью stringWithFormat: и получить тот же результат? - person HelmiB; 23.11.2012

Ничто в стандартных библиотеках этого не сделает, поэтому вы можете написать небольшую функцию шестнадцатеричного дампа или использовать что-то еще, что выводит недвусмысленные полные данные. Что-то типа:

char buf[1 + 3*dataLength];
strvisx(buf, data, dataLength, VIS_WHITE|VIS_HTTPSTYLE);
NSLog(@"data=%s", buf);

Для небольших фрагментов данных вы можете попытаться создать NSData и использовать метод debugDescription. В настоящее время это шестнадцатеричный дамп, но ничто не обещает, что так будет всегда.

person Stripes    schedule 23.11.2012
comment
VIS_WHITE не объявлен. что включить? - person HelmiB; 23.11.2012

Чтобы напечатать char* в NSLog, попробуйте следующее:

char data[6] = {'H','E','L','L','0','\n'};
NSString *string = [[NSString alloc] initWithUTF8String:data];
NSLog(@"%@", string);

Вам нужно будет null завершить вашу строку.

Из документации Apple:

- (instancetype)initWithUTF8String:(const char *)nullTerminatedCString;

Возвращает объект NSString, инициализированный путем копирования символов из заданного массива C байтов в кодировке UTF8.

person fotios    schedule 29.07.2014