2016-10-08 21 views
0

文字列「ZB3NNxAMNB/x6JpAryCd0g ==」がjavaでデコードされ、バイト[]で格納されています。しかし、私はどのキャラクタセットに基づいてデコードがJavaで起こっているのか分かりません。Javaのようにobjcでデコードする文字列

public byte[] decode(String src) { 
     return decode(src.getBytes(StandardCharsets.ISO_8859_1)); 
    } 

Iは上記に示したJavaで復号方法のメソッドシグネチャをチェックすると、デフォルトで示す文字セットがISO_8859_1あります。これは、次のコードによるデコードに使用される文字セットがISO_8859_1であることを意味しますか?

salt = Base64.getDecoder().decode(values.getProperty("s")); 

私は、次のコード

NSData *decodedData = [[NSData alloc] initWithBase64EncodedString:base64SaltString options:0]; 
NSString *decodedString = [[NSString alloc] initWithData:decodedData encoding:NSISOLatin1StringEncoding]; 

で行った。しかし、私は上記のコードが正しいことを確認していないされ、ObjectiveCで同じことを行うたい。また、Javaコードはデコードされたデータをbyte []に​​格納し、objectiveCに格納します。これはStringとして返されます。だから、デコードされたデータを比較して保証することはできません。誰も私にデコードされたデータを比較する方法を提案することはできますか?デコードされたデータをiOSとJavaの両方の単一のフォーマットに変換する。ヘルプを楽しみにしています。

答えて

1

Javaコードはエンコーディングについて何も表示しません。 は、Java SDKの使用をコードしているかを知る必要があります。

System.out.println("Default Charset=" + Charset.defaultCharset()); 

あなたのJava SDKは、UTF-8でコードを実行する場合:src.getBytes(StandardCharsets.ISO_8859_1)はISO_8859_1にUTF-8エンコーディング文字列を変更することができます。あなたは、Objective-Cでコードを見ることができます

- (void)testEncoding { 
    NSString *originStr = @"ñèÒ"; 

    //Encode : 
    NSData *utf8Data = [originStr dataUsingEncoding:NSUTF8StringEncoding]; 
    NSData *latinData = [originStr dataUsingEncoding:NSISOLatin1StringEncoding]; 

    NSLog(@"1.0: change a string's encoding ==>\n%@ ,%@",utf8Data,latinData); 

    NSString *utf8Base64String = [utf8Data base64EncodedStringWithOptions:0]; 
    NSString *latinDataBase64String = [latinData base64EncodedStringWithOptions:0]; 

    NSLog(@"1.1 encoding the data(byte[]) to base64string ==>\n%@ ,%@",utf8Base64String,latinDataBase64String); 

    //Decode : 
    NSData *utf8DecodeData = [[NSData alloc] initWithBase64EncodedString:utf8Base64String options:0]; 
    NSData *latinDecodeData = [[NSData alloc] initWithBase64EncodedString:latinDataBase64String options:0]; 

    NSLog(@"2.0 decode the base64string to data(byte[])==>\n %@ ,%@",utf8DecodeData,latinDecodeData); 

    NSString *utf8DecodeString = [[NSString alloc] initWithData:utf8DecodeData encoding:NSUTF8StringEncoding]; 
    NSString *latinDecodeString = [[NSString alloc] initWithData:latinDecodeData encoding:NSISOLatin1StringEncoding]; 

    NSLog(@"2.1 change the data(byte[]) the string with it's encoding ==>\n %@ ,%@",utf8DecodeString,latinDecodeString); 
} 

結果は

1.0: change a string's encoding ==> 
<c3b1c3a8 c29ac392> ,<f1e89ad2> 
1.1 encoding the data(byte[]) to base64string ==> 
w7HDqMKaw5I= ,8eia0g== 
2.0 decode the base64string to data(byte[])==> 
<c3b1c3a8 c29ac392> ,<f1e89ad2> 
2.1 change the data(byte[]) the string with it's encoding ==> 
ñèÒ ,ñèÒ 

あなたはNSISOLatin1StringEncodingにデフォルトでUTF-8エンコーディングされた文字列@"ñèÒ"を変更したとき、あなたは意志であります完全な別のデータを取得<f1e89ad2>とbase64string 8eia0g==

状況に応じて、javコードsrc.getBytes(StandardCharsets.ISO_8859_1)は、文字列をデータ(バイト[])に変更すると、Java環境によって異なります。だから私はあなたのbase64stringを復号するためのテストを行うが、私はcurrectあるエンコーディングわからない:

NSString *str = @"ZB3NNxAMNB/x6JpAryCd0g=="; 
NSData *data = [[NSData alloc] initWithBase64EncodedString:str options:0]; 

NSString *resultString = @""; 
for(NSInteger i=1;i<16;i++) { 
    NSString *strDe = [[NSString alloc] initWithData:data encoding:i]; 
    resultString = [NSString stringWithFormat:@"%@%zd => %@\n",resultString,i,strDe]; 
} 

NSLog(@"%@",resultString); 

結果は次のとおりです。非常に明確に記述する情報、ため

1 => dÍ74ñè@¯ Ò 
2 => d˝74æŁÜ@fl µ¼ 
3 => (null) 
4 => (null) 
5 => dÍ74ñè@¯ Ò 
6 => (null) 
7 => (null) 
8 => dヘ74咫ッ 旆 
9 => dÍ74ńč@Ż Ň 
10 => 搝촷ဌ㐟驀꼠鷒 
11 => dН74сиљ@Ї ќТ 
12 => (null) 
13 => (null) 
14 => (null) 
15 => dÍ74ńčš@Ż ťŇ 
+0

感謝。だから、Javaバイト配列のデコードされたデータ、インデックスによるインデックスは、objectiveCデコードされたデータと比較できないと言っていますか? –

関連する問題