Objective-C将十六进制字符串解析为整数

Ric*_*III 93 string iphone parsing hex objective-c

我想知道如何在Objective-C中解析表示数字的十六进制字符串.我愿意同时使用目标或基于C的方法,也没关系.

例:

#01FFFFAB
Run Code Online (Sandbox Code Playgroud)

应解析为整数:33554347

任何帮助,将不胜感激!

dre*_*lax 168

Joshua Weinberg的答案大多是正确的,但是0x在扫描十六进制整数时前缀是可选的.如果您有格式的字符串#01FFFFAB,您仍然可以使用 NSScanner,但您可以跳过第一个字符.

unsigned result = 0;
NSScanner *scanner = [NSScanner scannerWithString:@"#01FFFFAB"];

[scanner setScanLocation:1]; // bypass '#' character
[scanner scanHexInt:&result];
Run Code Online (Sandbox Code Playgroud)


Jos*_*erg 63

您可以使用NSScanner

unsigned int outVal;
NSScanner* scanner = [NSScanner scannerWithString:@"0x01FFFFAB"];
[scanner scanHexInt:&outVal];
Run Code Online (Sandbox Code Playgroud)

outVal将包含您正在寻找的int.0x是可选的.


Gra*_*rks 12

strtol()是你的朋友.

它将一个字符串转换为一个long,你可以传入该数字的基数.尽管首先签署#sign,但是传递给strtol一个指向第一个数字字符的指针.

  • int res = strtol([yourString UTF8String],NULL,base) (3认同)
  • @dreamlax -[NSString UTF8String] 的定义显示它返回一个指向支持 UTF8 C 字符串的指针 (NS_RETURNS_INNER_POINTER)。从较高层次来看,返回这个 const char 指针只需一个操作,而不是为 NSScanner 分配内存、复制 NSString 输入参数的开销,更不用说每次 ObjC 方法调用所产生的额外 ObjC 消息传递延迟。从算法上来说,使用 strtoull() 的速度要快得多,但除非您对数百万个字符串中的十六进制整数扫描进行基准测试,否则您可能不会观察到差异:-) (2认同)

Sah*_*jan 5

您可以使用以下行进行转换。它只有一行代码:

NSString *hexString = @"01FFFFAB";
length = (UInt64)strtoull([hexString UTF8String], NULL, 16);
NSLog(@"The required Length is %d", length);
Run Code Online (Sandbox Code Playgroud)

快乐编码!