2

我从 C# 来到 Objective-C,没有任何 C 的中间知识。(是的,是的,我需要在某个时候学习 C,我完全打算学习。)在 Apple 的证书、密钥和信任服务编程指南中,有是以下代码:

static const UInt8 publicKeyIdentifier[] = "com.apple.sample.publickey\0";
static const UInt8 privateKeyIdentifier[] = "com.apple.sample.privatekey\0";

我有一个NSString我想在这里用作标识符的标识符,在我的一生中,我无法弄清楚如何将其放入这个数据结构中。通过谷歌搜索也没有结果。我查看了NSString Class Reference并查看了UTF8StringandgetCharacters方法,但我无法将产品放入结构中。

我缺少什么简单易行的技巧?

4

4 回答 4

7

这些是 C 字符串:字符数组(不是 NSArray,而是 C 数组)。最后一个字符是 NUL,数值为 0。

“UInt8”是无符号八位字节的 CoreServices 名称,(在 Mac OS X 上)与无符号字符相同。

static表示该数组特定于该文件(如果它在文件范围内)或在函数调用中持续存在(如果它在方法或函数体内)。

const意思就是你猜的:你不能改变这些数组中的字符。

\0""是一个 NUL,但在这些示例中显示的文字中明确包含它是多余的。无论如何,""文字(没有@)都是以 NUL 结尾的。

C 没有指定编码。在 Mac OS X 上,它通常与 ASCII 兼容,通常是 UTF-8。

要将 NSString 转换为 C 字符串,请使用UTF8StringcStringUsingEncoding:。要让 NSString 将 C 字符串提取到缓冲区中,请使用getCString:maxLength:encoding:.

于 2009-06-30T23:41:20.447 回答
3

我认为有些人在这里忽略了重点。每个人都解释了为标签设置的两个常量数组,但是如果你想使用NSString,你可以简单地将它添加到属性字典中。您不必将其转换为任何东西。例如:

NSString *publicTag = @"com.apple.sample.publickey";
NSString *privateTag = @"com.apple.sample.privatekey";

该示例的其余部分保持完全相同。在这种情况下,根本不需要 C 字符串文字。

于 2009-06-30T23:55:34.100 回答
3

从 NSString获取char*(C 字符串)并不是棘手的部分。(顺便说一句,我还建议使用 UTF8String,它更简单。)Apple 提供的代码之所以有效,是因为它将C 字符串文字分配给static const数组变量。将函数或方法调用的结果分配给 aconst可能不起作用。

我最近回答了一个关于在 Objective-C 中定义常量的 SO question ,这应该对您的情况有所帮助。您可能不得不通过摆脱const修饰符来妥协。如果它被声明了static,你至少知道在声明它的编译单元之外没有人可以引用它,所以只要确保你不要让对它的引用“逃逸”,这样其他代码就可以通过指针等修改它。

但是,正如@Jason指出的那样,您甚至可能根本不需要将其转换为 char* 。示例代码为每个字符串创建一个 NSData 对象。您可以在代码中执行类似的操作(替换步骤 1 和 3):

NSData* publicTag  = [@"com.apple.sample.publickey"  dataUsingEncoding:NSUnicodeStringEncoding];
NSData* privateTag = [@"com.apple.sample.privatekey" dataUsingEncoding:NSUnicodeStringEncoding];

如果你已经有一个 NSString,那对我来说肯定比处理 C 数组更容易。

于 2009-06-30T21:40:03.953 回答
2

尝试这个

NSString *newString = @"这是一个测试字符串。";
字符 *theString;

theString = [newString cStringWithEncoding:[NSString defaultCStringEncoding]];

于 2009-06-30T20:33:19.250 回答