Objective-C는 16 진수 문자열을 정수로 구문 분석합니다.


94

Objective-C에서 숫자를 나타내는 16 진수 문자열을 구문 분석하는 방법을 알고 싶습니다. 객관적인 방법이나 C 기반 방법을 모두 사용할 의향이 있습니다. 둘 다 괜찮습니다.

예:

#01FFFFAB

정수로 구문 분석해야합니다. 33554347

어떤 도움을 주시면 감사하겠습니다!

답변:


169

Joshua Weinberg의 대답은 대부분 정확하지만 0x16 진수 정수를 스캔 할 때 접두사는 선택 사항입니다. 형식의 문자열이있는 경우 #01FFFFAB에도을 사용할 NSScanner수 있지만 첫 번째 문자는 건너 뛸 수 있습니다.

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

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

1
고마워요, 정확히 제가 필요했습니다!
Richard J. Ross III

엄격한 구문 분석을 수행하려면 먼저 문자열이 0x(또는 0X)로 시작하지 않는지 확인해야합니다 . NSScanner는 이러한 접두사를 허용합니다.
Chris Page

63

NSScanner 를 사용할 수 있습니다.

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

outVal찾고있는 int를 포함합니다. 0x는 선택 사항입니다.


1
또한 문자열 대체를 사용하여 # 문자를 0x 접두사로 변환 할 수 있습니다.
hotpaw2

unsigned int outVal이어야합니다.
wanghq

12

strtol ()은 당신의 친구입니다.

문자열을 long으로 변환하고 숫자의 밑수를 전달할 수 있습니다. 먼저 # 사인 오프를 제거하거나 첫 번째 숫자 문자에 대한 포인터를 strtol에 전달합니다.


1
이 방법은 nsscanner를 할당하는 것보다 훨씬 간단하고 빠릅니다.
크리스

1
@Chris : strtol을 사용하기 전에 NSString을 C 문자열로 변환해야하므로 NSString이 있으면 더 빠르지 않을 것입니다. 이미 C 문자열로 된 텍스트가 있다면 아마도 더 빠를 것입니다.하지만이 작업을 수천 또는 수백만 번하지 않는 한 성능 저하를 느낄 것 같지 않습니다.
dreamlax 2011

4
int res = strtol ([yourString UTF8String], NULL, base)
loretoparisi 2013

1
@dreamlax-[NSString UTF8String]의 정의는 지원 UTF8 C 문자열 (NS_RETURNS_INNER_POINTER)에 대한 포인터를 리턴 함을 보여줍니다. 높은 수준에서이 const char 포인터를 반환하는 것은 NSScanner에 대한 메모리 할당 오버 헤드와 NSString 입력 매개 변수를 복사하는 오버 헤드를 반환하는 단일 작업뿐입니다. 각 ObjC 메서드 호출에서 발생하는 추가 ObjC 메시지 전달 대기 시간은 말할 것도 없습니다. 알고리즘 적으로 strtoull ()을 사용하는 것이 훨씬 빠르지 만 수백만 개의 문자열에서 16 진수 정수를 스캔하는 것을 벤치마킹하지 않는 한 차이를 관찰하지 못할 것입니다. :-)
Jacob

1
strtol기능은 또한 훨씬 더 관대합니다. NSScanner더 많은 제어 를 제공 하는 몇 가지 놀라운 엣지 케이스를 찾을 수 있으므로 철저한 단위 테스트 (공백, 16 진수가 아닌 문자 등 포함)를 작성하십시오 .
Quintin Willison

5

변환을 위해 아래 줄을 사용할 수 있습니다. 단 한 줄 코드 :

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

행복한 코딩 !!!


엄격한 구문 분석을 수행하려면 먼저 문자열이 입력에서 유효하지 않은 것으로 간주 되는 0x(또는 0X) 또는 +/- 또는 기타 문자로 시작하지 않는지 확인해야합니다 .
Chris Page

2

Swift 4 표준 라이브러리는 모든 정수 유형을 구문 분석하기위한 새로운 이니셜 라이저를 도입했습니다. 기수 (즉, base)로 구문 분석 할 문자열을 사용하고 선택적 정수를 반환합니다.

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

@MZaragoza 좀 설명을 추가
알렉산더 Vasenin에게

0

사과에 따르면 :

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에서 허용하는 다른 문자로 시작하지 않는지 확인해야합니다 .
Chris Page

0

Swift 3 :

var hex = "#01FFFFAB"
hex.remove(at: hex.startIndex)
var rgbValue:UInt32 = 0
Scanner(string: hex).scanHexInt32(&rgbValue)
// rgbValue == 33554347
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.