2013-03-05 2 views
2

Я получил строковое представление NSData через NSLog, и я хотел бы построить оригинал NSData снова для целей тестирования, что лучший способ сделать это?Как построить NSData из описания?

например.

<fe010200 00000000 00011012> 
+0

См См http://stackoverflow.com/questions/7805340/retrieve-nsdata-to -hex-by-length –

+0

Также см. http://stackoverflow.com/questions/7520615/how-to-convert-an-nsdata-into-an-nsstring-hex-string –

+0

Спасибо, похоже на концепцию, но не точно то же самое - меня интересует переход от @ "fe010200 00000000 00011012" к фактическим NSData, содержащим эти байтовые данные. – Boon

ответ

0

Я думаю, что-то вроде:

NSArray *wordStrings = 
    [string componentsSeparatedByCharactersInSet: 
     [[NSCharacterSet alphanumericCharacterSet] invertedSet]]; 

NSMutableData *collectedData = [NSMutableData dataWithCapacity:wordStrings.count * sizeof(unsigned)]; 

for(NSString *word in wordStrings) 
{ 
    NSScanner *scanner = [NSScanner scannerWithString:word]; 
    unsigned newInt; 
    [scanner scanHexInt:&newInt]; 
    [collectedData appendBytes:&newInt length:sizeof(unsigned)]; 
} 

Это создает сканер для каждого слова после использования NSString для обеспечения расстояния в то время как было бы более эффективным, чтобы сделать все, что в сканере, но это только для отладки , правильно? Таким образом вы получаете середина wordStrings, чтобы убедиться, что ваши предположения о разрыве строки точны.

0

Вот несколько строк, что делает простое сканирование для чисел и добавлять их значения к объекту NSMutableData

NSString *dataIn = @"<fe010200 00000000 00011012>"; 

    const char *ptr = [dataIn cStringUsingEncoding:NSUTF8StringEncoding]; 

    NSMutableData *data = [NSMutableData data]; 

    while (*ptr) { 
     unsigned char c1 = *ptr; 
     ptr++; 
     if (isalpha(c1)) 
      c1 = (10 + c1 - 'a')<<4; 
     else if (isnumber(c1)) 
      c1 = (c1 - '0')<<4; 
     else 
      continue; 
     if (!*ptr) 
      break; // Shouldn't occure -- bad input 
     unsigned char c2 = *ptr; 
     ptr++; 
     if (isalpha(c2)) 
      c2 = 10 + c2 - 'a'; 
     else if (isnumber(c2)) 
      c2 = c2 - '0'; 
     c1 = c1 | c2; 
     [data appendBytes:&c1 length:1]; 
    } 

    NSLog(@"%@", data);