凯撒班加密目标C.

时间:2012-06-19 00:11:14

标签: objective-c encryption nsstring char

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

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

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

2 个答案:

答案 0 :(得分:2)

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

E.g。

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

结果:a

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

使用appendString您可以添加到NSMutableString

的末尾

答案 1 :(得分:1)

执行此操作的最佳方法可能是使用一个好的旧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可能会偶然出现在结果字符串中。