我有一个关于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代码错了! 有人能告诉我正确答案吗?
答案 0 :(得分:3)
您没有使用彼此相同的类型。
来自Java规范:
“char数据类型(因此Character对象封装的值)基于原始Unicode规范,该规范将字符定义为固定宽度的16位实体 .Unicode标准具有自从被改为允许其表示需要超过16位的字符。合法代码点的范围现在是U + 0000到U + 10FFFF,称为Unicode标量值。(请参阅U + n表示法中的U + n表示法。 Unicode标准。)“
在Java代码中,您将迭代16位对象。在OC代码中,您将迭代8位对象。
对于8位Java基元类型,请使用byte
。
答案 1 :(得分:1)
鉴于Java char
是一个16位值,您的Objective-C代码会给出不同的结果,因为您尝试使用UTF-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];