我有一个关于Java和OC xor的问题:
第一个xor,第二个Base64
在java中,代码是:
String numberStr = ("123456");
char[] array = numberStr.toCharArray();
for (int i = 0; i < array.length; i++)
{
array[i] = (char) (array[i] ^ 1984);
}
String xorStr = new String(array);
byte[] b = null;
String s = null;
try {
b = xorStr.getBytes("utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
if (b != null) {
try {
s = Base64.encodeToString(b, Base64.DEFAULT);;
} catch (Exception e) {
Log.e(TAG, e.toString());
}
}结果是: 37Hfst+z37Tftd+2
在OC中,代码:
NSString *numberString = @"123456";
NSData* bytes = [numberString dataUsingEncoding:NSUTF8StringEncoding];
int8_t * bytePtr = ( int8_t * )[bytes bytes];
NSInteger totalData = [bytes length] / sizeof(int8_t);
NSMutableString *finalString = [NSMutableString new];
for (int i = 0 ; i < totalData; i ++){
bytePtr[i] = (int8_t)(bytePtr[i]) ^ (1984);
[finalString appendString:[NSString stringWithFormat:@"%c",bytePtr[i]]];
NSLog(@"encrypt data = %d", bytePtr[i]);
}
NSData *finalData = [finalString dataUsingEncoding:NSUTF8StringEncoding];
NSString *baseString = [finalData base64EncodedStringWithOptions:0];得到的baseString是: w7HDssOzw7TDtcO2
为什么结果会不一样?我只知道我的OC代码是错的!有人能告诉我正确答案吗?
发布于 2017-11-15 01:17:36
您使用的类型不是彼此等效的类型。
来自Java规范:
“字符数据类型(以及字符对象封装的值)基于原始Unicode规范,该规范将字符定义为固定宽度的16位实体。此后,Unicode标准进行了更改,以允许表示需要超过16位的字符。合法代码点的范围现在是U+0000到U+10FFFF,称为Unicode标量值。(请参阅Unicode标准中U+n表示法的定义。)”
在Java代码中,您将遍历16位对象。在OC代码中,您将遍历8位对象。
对于8位Java原语类型,请使用byte。
发布于 2017-11-15 01:39:18
如果JavaUTF值是16位的,那么Objective-C代码会给出不同的结果,因为您正在尝试使用char -8编码和8位的值。
要使Objective-C代码像Java代码一样工作,您需要使用16位字符,而不是8位字节。
NSString *numberString = @"123456";
NSMutableString *finalString = [NSMutableString new];
for (NSInteger c = 0; c < numberString.length; c++) {
unichar char = [numberString characterAt:c];
char = char ^ 1984;
[finalString appendFormat:@"%C", char]; // Note C, not c
}
NSData *finalData = [finalString dataUsingEncoding:NSUTF8StringEncoding];
NSString *baseString = [finalData base64EncodedStringWithOptions:0];https://stackoverflow.com/questions/47291514
复制相似问题