gpt4 book ai didi

java - 像在 Java 中一样解码 objc 中的字符串

转载 作者:行者123 更新时间:2023-12-01 09:24:46 25 4
gpt4 key购买 nike

我有一个字符串“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 ,您将得到总共不同的数据 <f1e89ad2>和 base64string 8eia0g==

根据您的情况,您的java代码src.getBytes(StandardCharsets.ISO_8859_1)将字符串更改为数据(byte[])时会得到不同的值,具体取决于您的java环境。所以我做了一个测试来解码你的base64字符串,但我不确定哪种编码是正确的:

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ńčš@Ż ťŇ

关于java - 像在 Java 中一样解码 objc 中的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39929578/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com