Преобразование NSString в NSData без изменения данных - PullRequest
0 голосов
/ 18 октября 2011

У меня есть строка NSString, которая содержит ряд шестнадцатеричных значений, например:

6173736e 616d65a2 15165570 6f696e74 584e534f 626a6563

Однако мне нужны эти точно такие же данныебыть в объекте NSData.Я пытался делать такие вещи, как:

mydata = [mystring dataUsingEncoding: NSASCIIStringEncoding];// перепробовал все возможные варианты кодирования

Независимо от того, что я делаю, mydata никогда не содержит те же значения, что и NSString, что мне и нужно.

Будеточень ценю любую помощь!Спасибо.

Ответы [ 3 ]

1 голос
/ 18 октября 2011

Вы, кажется, неправильно поняли, что делает этот метод. Он не анализирует строку для шестнадцатеричного представления чисел; он просто создает объект данных, который представляет строку с определенной байтовой кодировкой. Таким образом, в вашем случае данные будут содержать байты со значениями 54 (значение ASCII для «6»), 49 (для «1»), 55 (для «7»), 51 (для «3»), 55 ( для «7»), 51 (для «3»), 54 (для «6»), 101 (для «е») и т. д.

Если вы хотите проанализировать шестнадцатеричные строки, вы можете использовать NSScanner для поиска шестнадцатеричных значений.

Вот основная форма того, что вы хотите:

NSScanner *scanner = [NSScanner scannerWithString:yourHexString];
NSMutableData *data = [NSMutableData data];
while (![scanner isAtEnd]) {
    unsigned value;
    if ([scanner scanHexInt:&value]) {
        [data appendBytes:&value length:sizeof(value)];
    } else {
        NSLog(@"Invalid value in scanned string");
    }
}

(Предупреждение: записано в браузере, не проверялось, может привести к краху, если вы попытаетесь запустить с ним ядерный реактор и т. Д.)

0 голосов
/ 16 апреля 2015

Поздно до вечеринки, которую я знаю, но у меня недавно была похожая проблема, я начал с ответа Джеймса Вебстера и пришел к следующему:

-(NSData*) dataFromString:(NSString*) s
{
    NSMutableData *d = [[NSMutableData alloc] init];
    for (int i = 0; i < [s length]; i++)
    {
        char c = [s characterAtIndex:i];
        [d appendBytes:&c length:1];
    }
    return d;
}
0 голосов
/ 18 октября 2011

В качестве примера берется первый символ 6.

Шестнадцатеричное значение для 6 символа (0x360d0a в соответствии с по этой ссылке , milageварьируется в зависимости от кодировки) не совпадает с шестнадцатеричным 0x6.

0x360d0a != 0x6

То, что у вас уже есть, кажется данными, хотя я не уверен, как вы можете записать эти данные точно снова.

Возможно, вам придется прибегнуть к чему-то вроде:

-(NSData*) dataFromString:(NSString*) s
{
    NSMutableData *d = [[NSMutableData alloc] init] autorelease];
    for (int i = 0; i < [s length]; i++)
    { 
         char c = [s characterAtIndex:i];
         switch (c)
         {
             case '0': [d appendData:/*Add data to represent 0*/]; break;
             case '1': [d appendData:/*Is this append as simple as append:0x1*/]; break;
             ...
             case 'F': [d appendData:/*Add data to represent F*/]; break;
             //All 16 cases
         }
    }
    return d;
}
...