2012-02-09 103 views
1

當我編寫了下面的方法來一個十六進制字符串轉換爲INT:奇怪的結果轉換十六進制字符串爲int

-(long)intFromHexString:(NSString*) string 
{ 
    char tempChar; 
    int temp; 
    tempChar=[string characterAtIndex:[string length]-1]; 
    temp=strtol(&tempChar, NULL, 16); 
    NSLog(@"***>%c = %i",tempChar,temp); 
    return temp; 
} 

它的大部分工作正常,但有時它確實進入大麻煩這樣的時候:

2012-02-10 01:09:28.516 GameView[7664:f803] ***>7 = 7 
2012-02-10 01:09:28.517 GameView[7664:f803] ***>7 = 7 
2012-02-10 01:09:28.518 GameView[7664:f803] ***>D = 13 
2012-02-10 01:09:28.519 GameView[7664:f803] ***>5 = 5 
2012-02-10 01:09:28.520 GameView[7664:f803] ***>5 = 5 
2012-02-10 01:09:28.520 GameView[7664:f803] ***>D = 13 
2012-02-10 01:09:28.521 GameView[7664:f803] ***>4 = 4 
2012-02-10 01:09:28.522 GameView[7664:f803] ***>4 = 4 
2012-02-10 01:09:28.522 GameView[7664:f803] ***>5 = 5 
2012-02-10 01:09:28.523 GameView[7664:f803] ***>4 = 1033 <------this 
2012-02-10 01:09:28.524 GameView[7664:f803] ***>C = 12 
2012-02-10 01:09:28.524 GameView[7664:f803] ***>B = 11 
2012-02-10 01:09:28.525 GameView[7664:f803] ***>3 = 3 
2012-02-10 01:09:28.526 GameView[7664:f803] ***>3 = 48 <------this 
2012-02-10 01:09:28.527 GameView[7664:f803] ***>B = 11 

誰能告訴我我的代碼有什麼問題嗎?

回答

5

您正在將指向單個字符的指針傳遞到strtol(),而不是以NUL結尾的字符串,因此strtol()有時會超出您提供的字符。 (例如, 「1033」 是它的發現 「409」,而不僅僅是 「4」 的結果。)

修復:

-(long)intFromHexString:(NSString*) string 
{ 
    char tempChar[2]; 
    int temp; 
    tempChar[0]=[string characterAtIndex:[string length]-1]; 
    tempChar[1] = 0; 
    temp=strtol(tempChar, NULL, 16); 
    NSLog(@"***>%c = %i",tempChar[0],temp); 
    return temp; 
} 
+0

謝謝你教我=) – HebitzLau 2012-02-09 17:31:39

相關問題