Невозможно декодировать сжатый Base64 NSString - PullRequest
0 голосов
/ 12 марта 2019

Итак, я пытаюсь декодировать строку в кодировке base64, но мне не везет .. decodedString всегда равно нулю! Я пытался часами и совершенно без идей. Даже пробовал сторонние библиотеки.

Код:

NSString *input = @"H4sIAAAAAAAEALWSTW/TQBCG/0q15wTN7Je9voU2RFFUFCnuASGE9mMcTB0n9QcSQvx3xm6QWsSFAzev53l3Zp9dcb8+HFab9fZOFGJ/3Ny+bbvdrt+MX56ePp9OeDyKhSi3TJWr+z0zEtAtQS1RligLowowbxSAzqWdyA/7NUMP+7tVueb12FPXi5vi5uOP+XubuJoHkpjQOghBW5c5Dzpo0sZj8FYaztVtP6MSeHG+XIMKpJQEQQcgnSobrHVRxco6qY2WcgoOdHq4NkKzENV7fyKOrnx3brneXNeHoavjY+PbxD+jb6hNfg7BQlCqh7Kesb+eNkfjZM65R/o+zxUpwxAzTyoinyL5hLnPJBkbK6h8YPTSnb9SHGbcGcgQfJDBWY0qhop5ixoJdRYUMZ6oedf44zzO5G1ftxxEqbSx4uenufVvr/9vile3MJndPbeaxPaD715YskswS4WlxAKhgCnASv+wKPMSTYHuuf7NN3XyA92ex3bgTdU/mB8vU/Iw+GHsOfpa2MvrFEGBTSEjrPiRVImCT8T7qJSMs5VJbPMX5JgDcAQDAAA=";

NSData *decodedData = [[NSData alloc] initWithBase64EncodedString:input options:0];
NSString *decodedString = [[NSString alloc] initWithData:decodedData encoding:NSUTF8StringEncoding];
NSLog(@"Decode String Value: %@", decodedString);

Ответы [ 2 ]

3 голосов
/ 12 марта 2019

Декодированный Base64 вывод - это , а не строка, это двоичные данные.

Возвращается ноль, потому что это не строка UTF-8, а произвольные данные, как правило, недопустимы в формате UTF-8.

Декодируйте с использованием NSDataBase64DecodingIgnoreUnknownCharacters, чтобы избежатьдекодер отбрасывает байты не-Base-64.

NSData *decodedData = [[NSData alloc]initWithBase64EncodedString:input
                       options:NSDataBase64DecodingIgnoreUnknownCharacters];

Если у вас есть decodedData, вы можете распаковать буфер любой функцией или библиотекой, которую вы выберете, затем вы можете прочитать строку.Возможно, вы захотите посмотреть ответ здесь , чтобы узнать, как распаковать ваши данные.

2 голосов
/ 12 марта 2019

decodedData не ноль.Это значение: <1f8b0800 ...

1f8b позвольте мне думать, что это GZip.

Любые шестнадцатеричные данные не конвертируются как таковые в строку с использованием кодировки UTF8.UTF8 не имеет значения для каждого возможного гекса.Есть недопустимая комбинация, поэтому ваша последняя строка равна нулю.Например, преобразуйте UIImage в PNG HexData (используя UIImagePNGRepresentation()) и попробуйте преобразовать его в NSString, используя NSUTF8StringEncoding.Вы увидите.

Используя код https://github.com/nicklockwood/GZIP/ (первый, который я нашел):

NSData *unzippedData = [decodedData gunzippedData];
NSString *decodedString = [[NSString alloc] initWithData:unzippedData encoding:NSUTF8StringEncoding];

Вывод:

"MESSAGEID":"PgGCBnrKKsGuhqq_mm1gg","TIMESTAMP":"2019-03-12T12:53:05.3004826","TYPE":"UPDATE","users" : [{"userId":"8be21d1690bb46979a04b4e45a1ba625","insId":"20","operId":"30222e0b4b0e4df6b669c3cf69245422","itemUserId":15,"fName":"Aaron","lName":"Strickland","calendarId":0,"editTime":"2019-03-12T12:53:05.3815928","keyId":"ce71bc7ae3c145adad18a72e56cf0fab","projectId":"950710ab2b96413cbfd186141e147b3e","delFlag":0,"userPin":"123456"}],"keys" : [{"keyId":"ce71bc7ae3c145adad18a72e56cf0fab","projectId":"950710ab2b96413cbfd186141e147b3e","insId":"20","itemKeyId":15,"startTime":"2016-05-31T21:10:00","endTime":"2019-03-28T15:19:00","validateCount":13,"editTime":"2019-03-12T12:53:05.3815928","updateStatus":1,"delFlag":0,"calendarId":"b306db7e1f924fdebade3813dd596f5d"}]

Кажется почтикак JSON.Я бы добавил "{" и "}" вокруг него.

С небольшим количеством обходного пути:

NSMutableData *finalData = [[NSMutableData alloc] initWithData:[@"{" dataUsingEncoding:NSUTF8StringEncoding]];
[finalData appendData:unzippedData];
[finalData appendData:[@"}" dataUsingEncoding:NSUTF8StringEncoding]];
NSData *dictionary = [NSJSONSerialization JSONObjectWithData:finalData options:0 error:nil];
NSLog(@"dictionary: %@", dictionary);

Вам решать, почему синтаксис странный, но с этимВы "годный к употреблению" NSDictionary.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...