什么';ocxor和javaxor的区别是什么?

什么';ocxor和javaxor的区别是什么?,java,ios,objective-c,xor,Java,Ios,Objective C,Xor,我有一个关于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 xorS

我有一个关于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());
        }
    }
stringnumberstr=(“123456”);
char[]数组=numberStr.toCharArray();
for(int i=0;i
结果是: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];
NSString*numberString=@“123456”;
NSData*字节=[numberString数据使用编码:NSUTF8StringEncoding];
int8_t*bytePtr=(int8_t*)[bytes];
NSInteger totalData=[bytes length]/sizeof(int8_t);
NSMutableString*finalString=[NSMutableString new];
对于(int i=0;i
结果基串为:w7HDssOzw7TDtcO2

为什么结果不同?我只知道我的OC代码错了!
有人能告诉我正确的答案吗?

您没有使用相互等效的类型

根据Java规范:

“char数据类型(因此也是Character对象封装的值)基于原始Unicode规范,该规范将字符定义为固定宽度16位实体。。此后,Unicode标准进行了更改,以允许表示需要超过16位的字符。法定代码点的范围现在为U+0000到U+10FFFF,称为Unicode标量值。(请参阅Unicode标准中U+n符号的定义。)

在Java代码中,迭代16位对象。在OC代码中,迭代8位对象


对于8位Java基元类型,请使用
byte

您没有使用彼此等效的类型

根据Java规范:

“char数据类型(因此也是Character对象封装的值)基于原始Unicode规范,该规范将字符定义为固定宽度16位实体。。此后,Unicode标准进行了更改,以允许表示需要超过16位的字符。法定代码点的范围现在为U+0000到U+10FFFF,称为Unicode标量值。(请参阅Unicode标准中U+n符号的定义。)

在Java代码中,迭代16位对象。在OC代码中,迭代8位对象


对于8位Java基元类型,请使用
byte

如果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];
NSString*numberString=@“123456”;
NSMutableString*finalString=[NSMutableString new];
对于(NSInteger c=0;c
假设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];
NSString*numberString=@“123456”;
NSMutableString*finalString=[NSMutableString new];
对于(NSInteger c=0;c
在8位值(来自数组)和16位值(1984)之间使用异或并将结果存储在8位变量中没有什么意义。但是用
uint8_t
替换
int8_t
可能会有帮助。您的转换是不正确的。
(int8_t)(bytePtr[i])^(1984);
应该是
(int8_t)(bytePtr[i]^1984);
。我用uint8\u t替换int8\u t,并使用(uint8\u t)(bytePtr[I]^1984),但结果仍然不同。在8位值(来自数组)和16位值(1984)之间使用异或没有什么意义并将结果存储在8位变量中。但是用
uint8\u t
替换
int8\u t
可能会有帮助。您的强制转换是不正确的。
(int8\u t)(bytePtr[i])^(1984);
应该是
(int8\u t)(bytePtr[i]^1984)
。我用uint8\u t替换了int8\u t,并使用(uint8\u t)(bytePtr[i]^1984),但结果仍然不同,要使Objective-C代码匹配,请使用UTF-16编码(大尾端或小尾端,以便匹配Java)和使用
uint16\u t
。我试图用int16\u t替换int8\u t,但结果仍然不同!我只想更改OC代码!您能帮我吗?您还必须更改字符串编码/解码方法。当正确的