【问题标题】:What's the difference between OC xor and Java xor?OC xor 和 Java xor 有什么区别?
【发布时间】:2018-04-27 17:45:29
【问题描述】:

我有一个关于 Java 和 OC 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 代码是错误的! 谁能告诉我正确答案?

【问题讨论】:

  • 在 8 位值(来自数组)和 16 位值(1984)之间使用 XOR 并将结果存储在 8 位变量中几乎没有意义。但将int8_t 替换为uint8_t 可能会有所帮助。而且您的演员阵容不正确。 (int8_t)(bytePtr[i]) ^ (1984); 应该是 (int8_t)(bytePtr[I] ^ 1984);
  • 我把 int8_t 换成了 uint8_t ,用 (uint8_t)(bytePtr[i] ^ 1984),结果还是不一样

标签: java ios objective-c xor


【解决方案1】:

您没有使用彼此等价的类型。

来自 Java 规范:

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

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

对于 8 位 Java 原始类型,请使用 byte

【讨论】:

  • 或者,为了使 Objective-C 代码匹配,使用 UTF-16 编码(无论是大端还是小端,以便与 Java 匹配)并使用 uint16_t
  • 我尝试用int16_t替换int8_t,结果还是不一样!我只想更改我的 OC 代码!你能帮帮我吗?
  • 您还必须更改字符串编码/解码方法。您正在使用 UTF-8 作为编码/解码机制,而正确的对应编码是 UTF-16(根据规范:“Java 平台在 char 数组中使用 UTF-16 表示”)。
【解决方案2】:

鉴于 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];

【讨论】:

  • 您需要逐行调试 Java 代码和 Objective-C 代码。确保使用 XOR 之前的每个值都相同。然后比较做异或后的值。弄清楚这两组代码在什么时候给出了不同的结果。使用比较结果更新您的问题。
  • 感谢您的回答!真的 !结果是一样的!
  • 您是说我的答案中的代码对您有用,而您现在得到的结果与 Java 代码相同?
猜你喜欢
  • 2011-05-09
  • 2016-08-07
  • 1970-01-01
  • 1970-01-01
  • 2013-06-21
  • 2015-05-21
  • 2011-02-08
  • 1970-01-01
  • 2010-11-11
相关资源
最近更新 更多