簡體   English   中英

無法解碼gzip壓縮的Base64 NSString

[英]Unable to decode gzipped Base64 NSString

所以我試圖解碼base64編碼的字符串,但我沒有任何運氣decodedString始終為null! 我已經嘗試了幾個小時,完全沒有想法。 甚至嘗試過第三方圖書館。

碼:

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);

Base64解碼的輸出不是字符串,而是二進制數據。

您將返回nil,因為它不是UTF-8字符串,並且任意數據通常不是有效的UTF-8。

使用NSDataBase64DecodingIgnoreUnknownCharacters進行解碼,以避免解碼器丟棄非Base-64字節。

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

decodedData ,可以使用決定的任何函數或庫對緩沖區進行解壓縮,然后讀取字符串。 您可能需要在此處查看答案,以獲取有關如何解壓縮數據的想法。

decodedData不為零。 它的值是: <1f8b0800 ...

1f8b讓我認為這是GZip。

任何十六進制數據是不可轉換的,例如利用成UTF8編碼的字符串。 UTF8沒有為每個可能的十六進制值。 由於存在無效的組合,因此您的最終字符串為nil。 例如,轉換一個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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM