0

文字列 "ZB3NNxAMNB/x6JpAryCd0g==" があり、これは Java でデコードされ、byte[] に格納されます。しかし、Javaでデコードが行われている文字セットに基づいているかどうかはわかりません。

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

上記の Java のデコード メソッドのメソッド シグネチャを確認したところ、デフォルトで表示される文字セットは ISO_8859_1 です。これは、次のコードでデコードに使用される文字セットが ISO_8859_1 であることを意味しますか?

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

次のコードで行ったのと同じことを ObjectiveC で実行したい

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

しかし、上記のコードが正しいかどうかはわかりません。また、違いは、Java コードがデコードされたデータをバイト [] と objectC に格納し、String として返すことです。したがって、デコードされたデータを比較して確認することはできません。デコードされたデータを比較する方法を誰かに提案できますか? デコードされたデータを iOS と Java の両方の単一の形式に変換するようなものです。ヘルプを楽しみにしています。

4

1 に答える 1

1

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

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

Java SDK が UTF-8 で実行されている場合、コードは : src.getBytes(StandardCharsets.ISO_8859_1)utf-8 エンコーディング文字列を ISO_8859_1 に変更できます。

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 ==>
 ñèÒ ,ñèÒ

@"ñèÒ"デフォルトで utf-8 エンコードされている文字列を に変更するNSISOLatin1StringEncodingと、合計の異なるデータ<f1e89ad2>と base64stringが得られます8eia0g==

あなたの状況では、src.getBytes(StandardCharsets.ISO_8859_1)文字列を data(byte[]) に変更すると、Java環境に応じてJavaコードが異なる値を取得します。したがって、base64string をデコードするテストを行いますが、どのエンコーディングが正しいかわかりません。

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ńčš@Ż ťŇ
于 2016-10-09T06:30:35.400 に答える