【问题标题】:Caesar Shift Encryption Objective C凯撒位移加密目标 C
【发布时间】:2012-06-21 00:13:06
【问题描述】:

我正在学习 Objective C 和 iOS 开发。我正在尝试重新创建我们在 Java 类中所做的一些项目(我知道它们完全不同),但我在其中一个项目中遇到了麻烦。有一天我们在实验室做凯撒轮班。字符串操作实验室。这在 Java 中是一个非常基本的交易……一个 for 循环遍历字符串并更改每个字符。我似乎找不到任何方法来更改 Objective C 中的单个字符。我查看了 NSMutableString 文档和 NSString 文档,我知道我可以做一个

[NSString stringByReplacingCharactersInRange:(NSRange *) withString:(NSString *)

但这并没有真正的帮助,因为我不知道我将要替换什么。我需要找到一种方法来抓取特定索引处的字符并进行更改。有什么想法吗?

【问题讨论】:

    标签: objective-c encryption nsstring char


    【解决方案1】:

    听起来您正在寻找[NSString characterAtIndex:(NSUInteger)] 方法

    例如

    NSString *string = @"abcde";
    NSString *character = [NSString stringWithFormat:@"%C",[string characterAtIndex: 0]];
    NSLog(@"%@", character);
    

    结果:一个

    使用它和NSMutableString,您可以构建您需要的字符串。

    使用appendString,您可以添加到NSMutableString 的末尾

    【讨论】:

    • -characterAtIndex: 返回 unichar,而不是 NSString。 -1 直到修复。
    • 我发誓我看过并没有看到任何关于 characterAtIndex 的信息!这正是我将用于 Java string.chatAt(); 的内容,这令人沮丧。不过还是谢谢你的回答。
    【解决方案2】:

    可能最好的方法是使用一个好的旧 C 字符串,因为它允许您更改字节而无需每次都重新分配不同的字符串:

    NSString *ceasarShift(NSString *input)
    {
        char *UTF8Str = strdup([input UTF8String]);
    
        int length = [input length];
        for (int i = 0; i < length; i++)
        {
             UTF8Str[i] = changeValueOf(UTF8Str[i]); // some code here to change the value
        }
    
        NSString *result = [NSString stringWithUTF8String:UTF8Str];
        free(UTF8Str);
    
        return result;
    }
    

    这减少了开销,虽然您必须在完成后释放分配的数据,但它为您提供了不依赖高级 API 的优势,从而大大提高了性能。 (数组集和动态方法查找之间的差异大约是 5 个 CPU 周期,如果您正在执行任何主要类型的加密,这意味着很多)

    也许还要查看 NSMutableData 来完成此类任务,而不是 NSString,因为随机的 \0 可能会出现在结果字符串中。

    【讨论】:

    • 如果输入包含任何需要超过一个字节才能用 UTF8 表示的内容,这就是自找麻烦——将 UTF8 字符串逐字节解析为普通 C 字符串只能以泪水结尾。
    • 我很欣赏这个答案,我相信你是对的......但我对常规 C 的唯一了解是你可以定义一个函数。我这周才开始使用 Objective-C。也许这些天的某个时候,这个答案对我来说会更好,但现在有点危险;)
    猜你喜欢
    • 2014-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    • 2014-03-07
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多