Je voudrais savoir comment analyser une chaîne hexadécimale, représentant un nombre, dans Objective-C. Je suis prêt à utiliser à la fois un objectif ou une méthode basée sur le C, c'est bien.
exemple:
#01FFFFAB
devrait analyser dans l'entier: 33554347
Toute aide serait appréciée!
La réponse de Joshua Weinberg est généralement correcte, mais le 0x
le préfixe est facultatif lors de l'analyse des entiers hexadécimaux. Si vous avez une chaîne au format #01FFFFAB
, vous pouvez toujours utiliser NSScanner
, mais vous pouvez ignorer le premier caractère.
unsigned result = 0;
NSScanner *scanner = [NSScanner scannerWithString:@"#01FFFFAB"];
[scanner setScanLocation:1]; // bypass '#' character
[scanner scanHexInt:&result];
vous pouvez utiliser NSScanner pour cela
unsigned int outVal;
NSScanner* scanner = [NSScanner scannerWithString:@"0x01FFFFAB"];
[scanner scanHexInt:&outVal];
outVal
contiendra l'int que vous recherchez. Le 0x est facultatif.
strtol () est votre ami.
Il convertit une chaîne en un long et vous pouvez passer la base du nombre. Supprimez d'abord cette signature, ou passez-la pour placer un pointeur sur le premier caractère numérique.
Vous pouvez utiliser la ligne ci-dessous pour la conversion. Son code d'une seule ligne:
NSString *hexString = @"01FFFFAB";
length = (UInt64)strtoull([hexString UTF8String], NULL, 16);
NSLog(@"The required Length is %d", length);
Joyeux codage !!!
Swift 4 la bibliothèque standard a introduit un nouvel initialiseur pour analyser tous les types entiers. Il faut une chaîne pour analyser avec radix (c'est-à-dire la base) et retourne un entier facultatif:
let number = Int("01FFFFAB", radix: 16)!
Selon Apple:
Un objet NSScanner interprète et convertit les caractères d'un objet NSString en valeurs numériques et chaînes.
donc, si vous avez NSData
obj u pouvez faire ensuite
NSString *dataDescription = data.description;
NSString *dataAsString = [dataDescription substringWithRange:NSMakeRange(1, [dataDescription length]-2)];
unsigned intData = 0;
NSScanner *scanner = [NSScanner scannerWithString:dataAsString];
[scanner scanHexInt:&intData];
Pour Swift 3:
var hex = "#01FFFFAB"
hex.remove(at: hex.startIndex)
var rgbValue:UInt32 = 0
Scanner(string: hex).scanHexInt32(&rgbValue)
// rgbValue == 33554347