2013-03-13 2 views
3

NSString에서 너무 큰 십진수가 있는데, 너무 커서 NSDecimal을 포함한 모든 변수에 맞지 않습니다. 저는 수동으로 수학을하고 있었지만 숫자를 변수에 넣을 수 없다면 저는 그것을 나눌 수 없습니다. 문자열을 변환하는 좋은 방법은 무엇입니까?정말 큰 10 진수 문자열을 16 진수로 변환 하시겠습니까?

예 입력 : 423723487924398723478243789243879243978234

출력 : 4DD361F5A772159224CE9EB0C215D2915FA

나는 첫 번째 대답 here보고 있었다, 그러나 C#으로 그리고 나는 그것이 객관적 C와 동등한 알고하지 않습니다.

누군가 외부 라이브러리 사용과 관련이없는 아이디어가 있습니까?

+2

가장 쉬운 방법은 iOS 용 큰 정수 라이브러리를 찾는 것입니다. iOS 용으로 [MPIR] (http://www.mpir.org/)을 컴파일 해보십시오. –

+0

[이 질문에 대한] 많은 주석가들 (http://stackoverflow.com/questions/1226949/biginteger-on-objective-c)이 언급해야 할 것은 C 용 BigInteger 라이브러리를 찾은 다음 Objective-C 코드에서 호출하십시오. – bdesham

+0

[Objective-C의 기본 62 변환] 중복 가능 (http://stackoverflow.com/questions/14780246/base-62-conversion-in-objective-c) –

답변

1

이것이 모두 필요한 경우 특히 Objective-C++를 기꺼이 사용하려는 경우 구현하기가 어렵지 않습니다. Objective-C++을 사용하면 vector을 사용하여 메모리를 관리 할 수 ​​있으므로 코드가 간단 해집니다.

// NSString+BigDecimalToHex.mm 
#import "NSString+BigDecimalToHex.h" 
#import <vector> 

// index 0 is the least significant digit 
typedef std::vector<uint16_t> BigInt; 
:

// NSString+BigDecimalToHex.h 
@interface NSString (BigDecimalToHex) 
- (NSString *)hexStringFromDecimalString; 
@end 

그것을 구현하기 위해, 우리는 기본-65536 숫자의 벡터로 임의 정밀도 음수가 아닌 정수를 나타내고 있습니다 : 여기

우리가 구현하는 것이다 인터페이스의

"어려운"부분은 BigInt에 10을 곱하여 하나의 십진수를 더하는 것입니다. 우리는 이것을 미리로드 된 캐리로 장수 곱하기로 쉽게 구현할 수 있습니다.

static void insertDecimalDigit(BigInt &b, uint16_t decimalDigit) { 
    uint32_t carry = decimalDigit; 
    for (size_t i = 0; i < b.size(); ++i) { 
     uint32_t product = b[i] * (uint32_t)10 + carry; 
     b[i] = (uint16_t)product; 
     carry = product >> 16; 
    } 
    if (carry > 0) { 
     b.push_back(carry); 
    } 
} 

도우미 메서드를 사용하여 인터페이스를 구현할 준비가되었습니다. 첫째, 우리는 각 진수에 대해 한 번씩 도우미 메서드를 호출하여 BigInt의 진수 문자열을 변환해야합니다 : 입력 문자열이 비어 있거나 모두 제로

- (NSString *)hexStringFromDecimalString { 
    NSUInteger length = self.length; 
    unichar decimalCharacters[length]; 
    [self getCharacters:decimalCharacters range:NSMakeRange(0, length)]; 
    BigInt b; 
    for (NSUInteger i = 0; i < length; ++i) { 
     insertDecimalDigit(b, decimalCharacters[i] - '0'); 
    } 

경우, b가 비어 있습니다. 우리는 확인해야합니다

if (b.size() == 0) { 
     return @"0"; 
    } 

지금 우리는 16 진수 문자열로 b 변환해야합니다. b의 최상위 자릿수가 가장 높은 지수입니다. 앞에 0을 방지하기 위해, 우리는 특별히 그 자리를 처리 할 수 ​​있습니다 :

다음
NSMutableString *hexString = [NSMutableString stringWithFormat:@"%X", b.back()]; 

우리 위해, 나머지 각 기본-65536 숫자 네 자리의 16 진수로 변환에서 가장 중요한 의미 이상으로 :

for (ssize_t i = b.size() - 2; i >= 0; --i) { 
     [hexString appendFormat:@"%04X", b[i]]; 
    } 

그리고 우리는 완료 :

return hexString; 
} 

당신은 내 전체 테스트 프로그램을 찾을 수 있습니다 (맥 명령 줄 프로그램으로 실행하기 위해) in this gist.

관련 문제