[英]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Í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ńčš@Ż ťŇ
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.