我想知道如何在Objective-C中解析代表数字的十六进制字符串。我愿意同时使用目标或基于C的方法。
例:
#01FFFFAB
应该解析为整数:33554347
任何帮助,将不胜感激!
Answers:
Joshua Weinberg的答案基本上是正确的,但是0x
在扫描十六进制整数时,前缀是可选的。如果您使用格式的字符串#01FFFFAB
,您仍然可以使用 NSScanner
,但是您可以跳过第一个字符。
unsigned result = 0;
NSScanner *scanner = [NSScanner scannerWithString:@"#01FFFFAB"];
[scanner setScanLocation:1]; // bypass '#' character
[scanner scanHexInt:&result];
0x
(或0X
)开头。NSScanner将接受这些前缀。
您可以为此使用NSScanner
unsigned int outVal;
NSScanner* scanner = [NSScanner scannerWithString:@"0x01FFFFAB"];
[scanner scanHexInt:&outVal];
outVal
将包含您要查找的int。0x是可选的。
strtol()是您的朋友。
它将字符串转换为长整数,您可以传入数字的基数。但是,请先去除#号,否则将其传递给第一个数字字符。
strtol
功能也宽松得多。编写详尽的单元测试(包括空格,非十六进制字符等),因为您会发现一些令人惊讶的边缘情况,这些情况NSScanner
使您可以更好地控制。
您可以使用以下行进行转换。它只有一行代码:
NSString *hexString = @"01FFFFAB";
length = (UInt64)strtoull([hexString UTF8String], NULL, 16);
NSLog(@"The required Length is %d", length);
快乐编码!
0x
(或0X
)或+/- 开头,或者输入中认为无效的任何其他字符。
Swift 4标准库引入了用于解析所有整数类型的新初始化器。它需要字符串以基数(即基数)进行解析,并返回可选的整数:
let number = Int("01FFFFAB", radix: 16)!
根据苹果的说法:
NSScanner对象将NSString对象的字符解释并转换为数字和字符串值。
因此,如果您有NSData
obj ,则可以下一步
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接受的任何其他字符。