第三方库中的多字符字符序列

时间:2011-07-29 22:51:09

标签: objective-c ios

我正在使用第三方库来处理我正在处理的iOS项目,我在项目中留下一个警告,即在这行代码上

[NSNumber numberWithUnsignedLongLong:'oaut']

警告是

Multi-character character constant

我吮吸C,所以我不知道如何解决这个问题,但我确信修复相对容易。帮助

编辑:更多背景。

@implementation MPOAuthCredentialConcreteStore (KeychainAdditions)

- (void)addToKeychainUsingName:(NSString *)inName andValue:(NSString *)inValue {
    NSString *serverName = [self.baseURL host];
    NSString *securityDomain = [self.authenticationURL host];
//  NSString *itemID = [NSString stringWithFormat:@"%@.oauth.%@", [[NSBundle mainBundle] bundleIdentifier], inName];
    NSDictionary *searchDictionary = nil;
    NSDictionary *keychainItemAttributeDictionary = [NSDictionary dictionaryWithObjectsAndKeys: (id)kSecClassInternetPassword, kSecClass,
                                                                                                securityDomain, kSecAttrSecurityDomain,
                                                                                                serverName, kSecAttrServer,
                                                                                                inName, kSecAttrAccount,
                                                                                                kSecAttrAuthenticationTypeDefault, kSecAttrAuthenticationType,
                                                                                                [NSNumber numberWithUnsignedLongLong:"oaut"], kSecAttrType,
                                                                                                [inValue dataUsingEncoding:NSUTF8StringEncoding], kSecValueData,
                                                     nil];


    if ([self findValueFromKeychainUsingName:inName returningItem:&searchDictionary]) {
        NSMutableDictionary *updateDictionary = [keychainItemAttributeDictionary mutableCopy];
        [updateDictionary removeObjectForKey:(id)kSecClass];

        SecItemUpdate((CFDictionaryRef)keychainItemAttributeDictionary, (CFDictionaryRef)updateDictionary);
        [updateDictionary release];
    } else {
        OSStatus success = SecItemAdd( (CFDictionaryRef)keychainItemAttributeDictionary, NULL);

        if (success == errSecNotAvailable) {
            [NSException raise:@"Keychain Not Available" format:@"Keychain Access Not Currently Available"];
        } else if (success == errSecDuplicateItem) {
            [NSException raise:@"Keychain duplicate item exception" format:@"Item already exists for %@", keychainItemAttributeDictionary];
        }
    }
}

编辑2:他们试图通过创建NSNumber来满足此要求:

@constant kSecAttrType Specifies a dictionary key whose value is the item's
        type attribute. You use this key to set or get a value of type
        CFNumberRef that represents the item's type. This number is the
        unsigned integer representation of a four-character code (e.g.,
        'aTyp').

3 个答案:

答案 0 :(得分:1)

在C和Obj-C中,单引号'仅用于单字符常量。您需要使用双引号:"

像这样:

[NSNumber numberWithUnsignedLongLong:"oaut"]

这涵盖了警告,但这里也存在语义问题。虽然单个字符常量(例如'o')可以视为整数(并且可以提升为unsigned long long),但“字符串”(char *char [] )不能,这意味着你不能使用"oaut"作为numberWithUnsignedLongLong:

的参数

更新

我猜这个四字符代码应该被视为一个整数,即每个char的8位就好像它们在一起是32位int: / p>

char code[] = "oaut";
uint32_t code_as_int = code[0] | (code[1] << 8) | (code[2] << 16) | (code[3] << 24);

[NSNumber numberWithUnsignedLongLong:code_as_int]

虽然我不确定这里会出现哪种字节序,也不确定为什么要求unsigned long long,除非只是确定有足够的位。

Rudy的评论,现在我认为是正确的 - 一些编译器允许多字符常量用于此目的(它是“实现定义的”行为)。

答案 1 :(得分:1)

'oaut'(单引号)是一个字符,因此编译器会尝试将其解释为多字节字符,但无法理解它。这解释了错误消息。

我想如果你给了一个正确的字符串,比如@“oaut”,你会收到另一条错误信息,因为numberWithUnsignedLongLong:需要unsigned long long,而不是字符串或字符。您是否尝试传递名为“oaut”的变量?如果是这样,请使用

[NSNumber numberWithUnsignedLongLong: oaut];

如果没有,那么请解释“oaut”是什么。

修改

'oaut'实际上可能是原始值。 C中存在多字符字符常量。使用(4字节)char,用作int并提升为unsigned long long将是可能的。这必须是旧代码。似乎这样的代码被CodeWarrior接受了。

假设真的是一个多字符char const,'oaut'看起来像一个“幻数”并选择了这个值,因为它是"oauth"的开头。我想它应该是值0x6F617574或0x7475616F。

答案 2 :(得分:0)

@Josh Caswell的回答是部分正确的,最简单的“官方”解决方案是:

[NSNumber numberWithUnsignedInt:'oaut']
在32位和64位cpu中,

unsigned int的长度为32位,这是Apple的一个实际例子:https://developer.apple.com/library/ios/samplecode/CryptoExercise/Listings/Classes_SecKeyWrapper_m.html