Objective-C에서 숫자를 나타내는 16 진수 문자열을 구문 분석하는 방법을 알고 싶습니다. 객관적인 방법이나 C 기반 방법을 모두 사용할 의향이 있습니다. 둘 다 괜찮습니다.
예:
#01FFFFAB
정수로 구문 분석해야합니다. 33554347
어떤 도움을 주시면 감사하겠습니다!
Objective-C에서 숫자를 나타내는 16 진수 문자열을 구문 분석하는 방법을 알고 싶습니다. 객관적인 방법이나 C 기반 방법을 모두 사용할 의향이 있습니다. 둘 다 괜찮습니다.
예:
#01FFFFAB
정수로 구문 분석해야합니다. 33554347
어떤 도움을 주시면 감사하겠습니다!
답변:
Joshua Weinberg의 대답은 대부분 정확하지만 0x
16 진수 정수를 스캔 할 때 접두사는 선택 사항입니다. 형식의 문자열이있는 경우 #01FFFFAB
에도을 사용할 NSScanner
수 있지만 첫 번째 문자는 건너 뛸 수 있습니다.
unsigned result = 0;
NSScanner *scanner = [NSScanner scannerWithString:@"#01FFFFAB"];
[scanner setScanLocation:1]; // bypass '#' character
[scanner scanHexInt:&result];
0x
(또는 0X
)로 시작하지 않는지 확인해야합니다 . NSScanner는 이러한 접두사를 허용합니다.
strtol ()은 당신의 친구입니다.
문자열을 long으로 변환하고 숫자의 밑수를 전달할 수 있습니다. 먼저 # 사인 오프를 제거하거나 첫 번째 숫자 문자에 대한 포인터를 strtol에 전달합니다.
strtol
기능은 또한 훨씬 더 관대합니다. NSScanner
더 많은 제어 를 제공 하는 몇 가지 놀라운 엣지 케이스를 찾을 수 있으므로 철저한 단위 테스트 (공백, 16 진수가 아닌 문자 등 포함)를 작성하십시오 .
변환을 위해 아래 줄을 사용할 수 있습니다. 단 한 줄 코드 :
NSString *hexString = @"01FFFFAB";
length = (UInt64)strtoull([hexString UTF8String], NULL, 16);
NSLog(@"The required Length is %d", length);
행복한 코딩 !!!
0x
(또는 0X
) 또는 +/- 또는 기타 문자로 시작하지 않는지 확인해야합니다 .
Swift 4 표준 라이브러리는 모든 정수 유형을 구문 분석하기위한 새로운 이니셜 라이저를 도입했습니다. 기수 (즉, base)로 구문 분석 할 문자열을 사용하고 선택적 정수를 반환합니다.
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에서 허용하는 다른 문자로 시작하지 않는지 확인해야합니다 .