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

Posted

技术标签:

【中文标题】Objective-C 将十六进制字符串解析为整数【英文标题】:Objective-C parse hex string to integer 【发布时间】:2011-04-08 14:01:44 【问题描述】:

我想知道如何在 Objective-C 中解析代表数字的十六进制字符串。我愿意同时使用目标或基于 C 的方法,两者都可以。

示例:

#01FFFFAB

应该解析成整数: 33554347

任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:

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

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

[scanner setScanLocation:1]; // bypass '#' character
[scanner scanHexInt:&result];

【讨论】:

谢谢,正是我需要的! 注意,如果要进行严格解析,首先要检查字符串不是以0x(或0X)开头。 NSScanner 将接受这些前缀。【参考方案2】:

您可以为此使用NSScanner

unsigned int outVal;
NSScanner* scanner = [NSScanner scannerWithString:@"0x01FFFFAB"];
[scanner scanHexInt:&outVal];

outVal 将包含您要查找的 int。 0x 是可选的。

【讨论】:

另外,您可以使用字符串替换将 # 字符转换为 0x 前缀。 应该是 unsigned int outVal;【参考方案3】:

strtol() 是你的朋友。

它将字符串转换为长字符串,您可以将数字的基数传入。尽管先去掉 # 符号,或者将指向第一个数字字符的指针传递给 strtol。

【讨论】:

我将使用这种方法,比分配 nsscanner 更简单(并且可能更快)。 @Chris:如果你有一个 NSString 可能不会更快,因为你需要在使用 strtol 之前将 NSString 转换为 C 字符串。如果您已经将文本保存在 C 字符串中,它可能会更快,但除非您这样做数千或数百万次,否则我怀疑您会感觉到性能受到影响。 int res = strtol([yourString UTF8String], NULL, base) @dreamlax -[NSString UTF8String] 的定义表明它返回一个指向支持 UTF8 C 字符串 (NS_RETURNS_INNER_POINTER) 的指针。在高层次上,返回这个 const char 指针只是一个操作,而不是为 NSScanner 分配内存、复制 NSString 输入参数的开销,更不用说每个 ObjC 方法调用产生的额外 ObjC 消息传递延迟。使用 strtoull() 在算法上要快得多,但除非您对扫描数百万个字符串中的十六进制整数进行基准测试,否则您可能不会观察到差异:-) strtol 函数也更加宽松。编写详尽的单元测试(包括空格、非十六进制字符等),因为您会发现一些令人惊讶的边缘情况,NSScanner 可以让您更好地控制。【参考方案4】:

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

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

编码愉快!!!

【讨论】:

注意,如果要进行严格解析,首先要检查字符串不以0x(或0X)或+/-或任何其他不考虑的字符开头在您的输入中有效。【参考方案5】:

Swift 4 标准库引入了用于解析所有整数类型的新初始化程序。它需要字符串来解析基数(即基数)并返回可选整数:

let number = Int("01FFFFAB", radix: 16)!

【讨论】:

@MZaragoza 我添加了一些解释【参考方案6】:

根据苹果:

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 接受。【参考方案7】:

对于 Swift 3:

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

【讨论】:

以上是关于Objective-C 将十六进制字符串解析为整数的主要内容,如果未能解决你的问题,请参考以下文章

如何将十六进制颜色字符串解析为整数

将十六进制字符串解析为整数会引发 NumberFormatException?

Swift将十六进制字符串或字符转换为整数

将二进制字符串解析为整数时出现数字格式异常

如何在颤动中将十六进制颜色代码解析为它们各自的整数值

c_cpp Objective-C类将十六进制字符串转换为UIColor。支持#RGB#ARGB #RRGGBB #AARRGGBBUsage:[UIColor colorWithHexString: