NSDateFormatter для расшифрованной строки

Я пытаюсь получить зашифрованную дату с веб-сервера и преобразовать ее в объект NSDate. Но средство форматирования даты всегда возвращает нулевую дату. Расшифрованная строка не работает с средством форматирования даты, но работает ввод прямой строки даты.

Как мне отладить эту проблему и заставить средство форматирования даты анализировать мою дату?

// Decrypt the message
NSData *encrypted = [NSData dataFromBase64String:dataReturned];
NSData *decrypted = [encrypted AES128DecryptWithKey:key];
NSString *decryptedString = [[NSString alloc] initWithData:decrypted encoding:NSASCIIStringEncoding]; 
// decryptedString is @"2011-04-02" according to GDB

//  NSString *decryptedString = @"2011-04-02"; //This works
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];    
NSLocale *enUSPOSIXLocale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease];
[formatter setLocale:enUSPOSIXLocale];
[formatter setDateFormat:@"yyyy-MM-dd"];

NSDate *expiryDate = [formatter dateFromString:[decryptedString stringByTrimmingCharactersInSet:
                                                [NSCharacterSet whitespaceAndNewlineCharacterSet]]];

person Dan    schedule 03.04.2011    source источник
comment
Это может быть совершенно неправильно, но у меня есть подозрение, что что-то происходит с этим оператором trim, который мешает этому. Вы пробовали это без оператора триммера? Или, если не в чем, вытащить обрезку в отдельную строку и проверить результат, прежде чем передать форматтеру?   -  person Chris Thompson    schedule 03.04.2011
comment
На самом деле я сначала пробовал без обрезки, и это не сработало. Я добавил обрезку, потому что думал, что это проблема, но она тоже не сработала. Я как бы просто оставил отделку там потом.   -  person Dan    schedule 03.04.2011


Ответы (2)


Что ж, если это работает, когда вы жестко кодируете «2011-04-02», и не работает, когда вы думаете, что расшифровали «2011-04-02», то, очевидно, между этими двумя строками есть какая-то разница.

Как насчет анализа и сравнения обеих строк в коде, чтобы попытаться найти разницу.

Например:

decryptedString = [decryptedString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

NSString* goodString = @"2011-04-02";

NSLog(@"Decrypted String: %@", decryptedString);
NSLog(@"Good String: %@", goodString);
NSLog(@"Compare: %d" [goodString compare:decryptedString]);  // 0 means they're identical.

NSDate* expiryDate = [formatter dateFromString:decryptedString];
NSDate* goodDate = [formatter dateFromString:goodString];

NSLog(@"Decrypted Date: %@", expiryDate);
NSLog(@"Good Date: %@", goodDate);

Запустите код и посмотрите на вывод консоли. Надеюсь, проблема станет немного яснее.

person Darren    schedule 03.04.2011
comment
Расшифрованная строка: 2011-04-02 Хорошая строка: 2011-04-02 Сравнить: -1 Расшифрованная дата: (нулевая) Хорошая дата: 2011-04-01 22:00:00 +0000 - person Dan; 03.04.2011
comment
Я не знаю, как найти разницу между хорошей строкой и расшифрованной строкой. - person Dan; 03.04.2011
comment
-1 означает, что строки разные. Вы видите разницу, когда обе эти строки выводятся на консоль? Если нужно, сделайте посимвольное сравнение. Возможно, в вашей расшифрованной строке есть начальный NULL или управляющий символ. - person Darren; 03.04.2011
comment
Мой первый комментарий — распечатка консоли. Мой человеческий глаз не видит разницы, может в основе другая? - person Dan; 03.04.2011
comment
Выполните посимвольное сравнение, используя метод -characterAtIndex:. - person Darren; 03.04.2011
comment
или просто сравните lengthили напечатайте байты, преобразовав в NSData или получив массив char * - person Vincent Guerci; 03.04.2011

Не знаю, почему расшифрованная строка имеет длину 16, а правильная строка имеет длину 10.

Мне удалось исправить это, удалив управляющие символы.

decryptedString = [decryptedString stringByTrimmingCharactersInSet:[NSCharacterSet controlCharacterSet]];

person Dan    schedule 03.04.2011