簡體   English   中英

像在Java中那樣在objc中解碼字符串

[英]Decoding string in objc as in Java

我有一個字符串“ 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代碼將解碼后的數據存儲到byte []和ObjectiveC中,並以String形式返回。 因此,我無法比較解碼后的數據並確保。 誰能建議我比較解碼數據的方法? 就像將解碼后的數據轉換為iOS和Java的單一格式一樣。 期待獲得幫助。

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 ,您將獲得全面的8eia0g==數據<f1e89ad2>和base64string 8eia0g==

對於您的情況,當將字符串更改為data(byte [])取決於您的Java環境時,您的Java代碼src.getBytes(StandardCharsets.ISO_8859_1)將獲得不同的值。 所以我做了一個測試來解碼您的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Í74ñè@¯ Ò
2 => d˝74æŁÜ@fl µ¼
3 => (null)
4 => (null)
5 => dÍ74ñè@¯ Ò
6 => (null)
7 => (null)
8 => dヘ74咫ッ 旆
9 => dÍ74ńč@Ż Ň
10 => 搝촷ဌ㐟驀꼠鷒
11 => dН74сиљ@Ї ќТ
12 => (null)
13 => (null)
14 => (null)
15 => dÍ74ńčš@Ż ťŇ

暫無
暫無

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

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