我想知道如何在Objective-C中解析代表数字的十六进制字符串。 我愿意使用目标方法或基于C的方法,两种方法都可以。
示例:
示例:
#01FFFFAB
应该解析为整数: 33554347
任何帮助将不胜感激!
#01FFFFAB
应该解析为整数: 33554347
任何帮助将不胜感激!
Joshua Weinberg的答案基本正确,然而在扫描十六进制整数时,0x
前缀是可选的。如果你有一个格式为#01FFFFAB
的字符串,你仍然可以使用NSScanner
,但是可以跳过第一个字符。
unsigned result = 0;
NSScanner *scanner = [NSScanner scannerWithString:@"#01FFFFAB"];
[scanner setScanLocation:1]; // bypass '#' character
[scanner scanHexInt:&result];
你可以使用NSScanner来完成这个任务。
unsigned int outVal;
NSScanner* scanner = [NSScanner scannerWithString:@"0x01FFFFAB"];
[scanner scanHexInt:&outVal];
outVal
将包含你需要的整数。0x是可选项。
strtol() 是你的好帮手。
它将一个字符串转换为长整型,可以传递数字的进制。但是,要先去掉那个#符号,或者将指向第一个数字字符的指针传递给 strtol。
int res = strtol([yourString UTF8String], NULL, base);
其中,yourString
是要转换的字符串,base
是转换时使用的进制数。 - loretoparisiNSString
对象存储为UTF-16而不是UTF-8,因此需要首先进行转换为UTF-8(这可能是代价高昂的),而 NSScanner
可能已经针对UTF-16进行了优化。NS_RETURNS_INNER_POINTER
是一个注释,它延长了对象的生命周期,直到返回指针的最后使用(或任何从中派生的指针)。请参见这里。它适用于ARC / GC。 - dreamlaxstrtol
函数也更加宽容。编写彻底的单元测试(包括空格、非十六进制字符等),因为你会发现一些令人惊讶的边缘情况,而NSScanner
可以给你更多的控制权。 - Quintin WillisonNSString *hexString = @"01FFFFAB";
length = (UInt64)strtoull([hexString UTF8String], NULL, 16);
NSLog(@"The required Length is %d", length);
愉快编码!!!
Swift 4 标准库引入了一种新的初始化方法,用于解析所有整数类型。它接受要解析的字符串和进制(即基数),并返回可选的整数:
let number = Int("01FFFFAB", radix: 16)!
对于Swift 3:
var hex = "#01FFFFAB"
hex.remove(at: hex.startIndex)
var rgbValue:UInt32 = 0
Scanner(string: hex).scanHexInt32(&rgbValue)
// rgbValue == 33554347
根据 Apple:
NSScanner 对象将 NSString 对象的字符解释和转换为数字和字符串值。
因此,如果您有 NSData 对象,则可以执行以下操作
NSString *dataDescription = data.description;
NSString *dataAsString = [dataDescription substringWithRange:NSMakeRange(1, [dataDescription length]-2)];
unsigned intData = 0;
NSScanner *scanner = [NSScanner scannerWithString:dataAsString];
[scanner scanHexInt:&intData];
0x
(或0X
)或任何其他在输入中不被视为有效但被NSScanner接受的字符开头。 - Chris Page