字符串异或

作者: 大刘 | 来源:发表于2022-06-25 21:38 被阅读0次

    Created by 大刘 liuxing8807@126.com

    #import <Foundation/Foundation.h>
    
    NS_ASSUME_NONNULL_BEGIN
    
    @interface NSString (UTIL)
    
    + (nonnull NSString *)simpleXor:(nonnull NSString *)info key:(nonnull NSString *)key;
    
    @end
    
    NS_ASSUME_NONNULL_END
    
    #import "NSString+UTIL.h"
    
    @implementation NSString (UTIL)
    
    + (nonnull NSString *)simpleXor:(nonnull NSString *)info key:(nonnull NSString *)key {
        const char *infoBytes = [info UTF8String];
        const char *keyBytes = [key UTF8String];
        
        int i = 0, j = 0;
        char *bytes = malloc(strlen(infoBytes));
        for (i = 0; i < strlen(infoBytes); i++) {
            bytes[i] = (char) (infoBytes[i] ^ keyBytes[j]);
            
            j++;
            j = j % (key.length);
        }
        
        // 使用strlen(infoBytes), 而不是strlen(bytes)
        // 因为bytes里面有\0,而strlen只计算\0之前数,所以最终的长度偏小
        NSData *data = [NSData dataWithBytes:bytes length:strlen(infoBytes)];
        free(bytes);
        NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        return str;
    }
    
    @end
    
    #import <Foundation/Foundation.h>
    #import "NSString+UTIL.h"
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            /**
             这就是异或运算⊕的特征:
             0⊕x=x
             1⊕x=x'(x'表示取反)
             x⊕x=0
             所以有:y⊕x⊕x=y
             */
            NSString *str = [NSString simpleXor:@"DALIU" key:@"123456"];
            NSLog(@"%@", str); // us\^?}`
            str = [NSString simpleXor:str key:@"123456"];
            NSLog(@"%@", str); // DALIU
        }
        return 0;
    }
    

    相关文章

      网友评论

        本文标题:字符串异或

        本文链接:https://www.haomeiwen.com/subject/vbqwvrtx.html