6

ObjectiveCでBase64でエンコードされた文字列をデコードする方法に関する多数のStackOverflowの投稿を見てきましたが、まだ問題があります。

基本的に、私はPythonスクリプトをObjectiveCに移植しようとしています。Pythonのコード行は次のとおりです。

zlib.decompress(base64.urlsafe_b64decode(string))

Pythonバージョンのbase64.urlsafe_b64decodeで「文字列」を実行すると、正しく表示され、適切にZlibで解凍できます。「文字列」をObjectiveCBase64デコーダーの任意のバリアントで実行すると、一種の動作が得られますが、結果は同じではなく、Zlibの解凍は失敗します。

URLセーフなBase64デコードと、ここSOで広く利用できるコードに違いはありますか?誰かが以前にこのような困難を経験したことがあるなら、何をすべきかについての洞察はありがたいです。

ありがとう、そう!

編集1:ここにあるBase64コードを使用しました。元のデータ(まだBase64でエンコードされている)はここにあり、生成されたObjective-Cはここにあり、生成されたPythonはここにあります。理想的には、ObjectiveCコードをPythonスクリプトと同じテキストにデコードする必要があります。

4

2 に答える 2

13

RFC の違いを指摘してくれた Graham に特に感謝し、問題を解決することができました。将来誰かがこれに遭遇した場合、解決方法は次のとおりです。

  1. ここから NSData+Base64 コードをダウンロードします。
  2. ではNSData+Base64.m、ルックアップ テーブルを次のように変更する必要があります。
//
// Mapping from 6 bit pattern to ASCII character.
//
static unsigned char base64EncodeLookup[65] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";

//
// Definition for "masked-out" areas of the base64DecodeLookup mapping
//
#define xx 65

//
// Mapping from ASCII character to 6 bit pattern.
//
static unsigned char base64DecodeLookup[256] =
{
    xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, 
    xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, 
    xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, 62, xx, xx, 
    52, 53, 54, 55, 56, 57, 58, 59, 60, 61, xx, xx, xx, xx, xx, xx, 
    xx,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 
    15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, xx, xx, xx, xx, 63, 
    xx, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 
    41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, xx, xx, xx, xx, xx, 
    xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, 
    xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, 
    xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, 
    xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, 
    xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, 
    xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, 
    xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, 
    xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, 
};

これにより、Objective C のデコードが Python のデコードと同等になります。

于 2012-06-19T18:47:24.100 に答える
11

iOS 7.0 以降には、上記のルックアップを行う NSData のメソッド「base64EncodedStringWithOptions」があります。ただし、このメソッドは URL セーフにエンコードされた文字列を返しません。そのため、URL セーフ エンコード文字列を取得するには、手動で置換を行う必要があります。下記参照..

NSData *originalData = [originalString dataUsingEncoding:NSUTF8StringEncoding];
NSString *base64String = [originalData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
base64String = [base64String stringByReplacingOccurrencesOfString:@"/" withString:@"_"];
base64String = [base64String stringByReplacingOccurrencesOfString:@"+" withString:@"-"];

結果の base64String は URL セーフになりました。

于 2015-02-23T21:42:45.813 に答える