web-dev-qa-db-fra.com

Objective-C analyse la chaîne hexadécimale en entier

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!

91

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];
166
dreamlax

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.

62
Joshua Weinberg

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.

12
Graham Perks

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 !!!

4
iProgrammer

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)!
1
Alexander Vasenin

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];
0
gbk

Pour Swift 3:

var hex = "#01FFFFAB"
hex.remove(at: hex.startIndex)
var rgbValue:UInt32 = 0
Scanner(string: hex).scanHexInt32(&rgbValue)
// rgbValue == 33554347
0
Joey Nelson