首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OC xor和Java xor有什么区别?

OC xor和Java xor有什么区别?
EN

Stack Overflow用户
提问于 2017-11-15 01:08:37
回答 2查看 107关注 0票数 1

我有一个关于Java和OC xor的问题:

第一个xor,第二个Base64

在java中,代码是:

代码语言:javascript
复制
     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中,代码:

代码语言:javascript
复制
    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代码是错的!有人能告诉我正确答案吗?

EN

回答 2

Stack Overflow用户

发布于 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

票数 3
EN

Stack Overflow用户

发布于 2017-11-15 01:39:18

如果JavaUTF值是16位的,那么Objective-C代码会给出不同的结果,因为您正在尝试使用char -8编码和8位的值。

要使Objective-C代码像Java代码一样工作,您需要使用16位字符,而不是8位字节。

代码语言:javascript
复制
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];
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47291514

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档