Конвертировать строку Hex в NSString текста? - PullRequest
5 голосов
/ 29 июня 2011

Мне нужно преобразовать NSString шестнадцатеричных значений в NSString текста (ASCII). Например, мне нужно что-то вроде:

"68 65 78 61 64 65 63 69 6d 61 6c" to be "hexadecimal"

Я посмотрел и подправил код в этой теме , но он не работает для меня. Он функционален только с одной шестнадцатеричной парой. Что-то делать с пробелами? Любые советы или примеры кода очень ценятся.

Ответы [ 3 ]

8 голосов
/ 29 июня 2011

Хорошо, я изменю то же самое для вашей цели.

NSString * str = @"68 65 78 61 64 65 63 69 6d 61 6c";
NSMutableString * newString = [NSMutableString string];

NSArray * components = [str componentsSeparatedByString:@" "];
for ( NSString * component in components ) {
    int value = 0;
    sscanf([component cStringUsingEncoding:NSASCIIStringEncoding], "%x", &value);
    [newString appendFormat:@"%c", (char)value];
}

NSLog(@"%@", newString);
6 голосов
/ 29 июня 2011

Вы можете использовать NSScanner , чтобы получить каждого персонажа. Пробелы будут необходимы для разделения каждого значения, иначе сканер продолжит сканирование и проигнорирует другие данные.

- (NSString *)hexToString:(NSString *)string {
    NSMutableString * newString = [[NSMutableString alloc] init];
    NSScanner *scanner = [[NSScanner alloc] initWithString:string];
    unsigned value;
    while([scanner scanHexInt:&value]) {
        [newString appendFormat:@"%c",(char)(value & 0xFF)];
    }
    string = [newString copy];
    [newString release];
    return [string autorelease];
}

// called like:
NSLog(@"%@",[self hexToString:@"68 65 78 61 64 65 63 69 6d 61 6c"]);
0 голосов
/ 17 декабря 2015

В моем случае в исходной строке не было разделителей, например «303034393934». Вот мое решение.

NSMutableString *_string = [NSMutableString string];
for (int i=0;i<12;i+=2) {
    NSString *charValue = [tagAscii substringWithRange:NSMakeRange(i,2)];
    unsigned int _byte;
    [[NSScanner scannerWithString:charValue] scanHexInt: &_byte];
         if (_byte >= 32 && _byte < 127) {
             [_string appendFormat:@"%c", _byte];
          } else {
             [_string appendFormat:@"[%d]", _byte];
          }
}
NSLog(@"%@", _string);
...