2010-02-23 22 views
0

我有一堆數據在下面列出的格式,我需要從2位十六進制轉換爲其各自的整數值。有什麼我可以指定給NSScanner,一次只需要2個字符進行轉換。或者我是否需要手動斷開字符串(例如「D8」「BE」...)或將其重新格式化以包含NSScanner將理解的分隔符(例如@「D8 BE 98 31 BC 96 17 EB 29 54」?NSScanner是否可以通過一定數量的字符進行解析?

注:這是什麼,我試圖做的(它不工作)

NSString *fakeData = [[NSString alloc] initWithString:@"D8BE9831BC9617EB2954"]; 
NSScanner *responseScanner = [NSScanner scannerWithString:fakeData]; 
unsigned int intValue; 

while([responseScanner isAtEnd] == NO) { 
    [responseScanner scanHexInt:&intValue]; 
    NSLog(@"HEX : %d", intValue);  
} 

這樣一個例子:將一個答案(這工作)

NSString *fakeData = [[NSString alloc] initWithString:@"D8 BE 98 31 BC 96 17 EB 29 54"]; 
NSScanner *responseScanner = [NSScanner scannerWithString:fakeData]; 
unsigned int intValue; 

while([responseScanner isAtEnd] == NO) { 
    [responseScanner scanHexInt:&intValue]; 
    NSLog(@"HEX : %d", intValue);  
} 

EDIT_001

非常感謝你的頭像NSScanner肯定是非常有用的,只是一個恥辱,你不能指定多少位數組成你想要抓取的十六進制數。

NSString *fakeData = [[NSString alloc] initWithString:@"D8BE9831BC9617EB2954"]; 
unsigned int intValue; 

for(unsigned int location=0; location<[fakeData length]-1; location+=2) { 
    NSString *subString = [fakeData substringWithRange:NSMakeRange(location, 2)]; 
    NSScanner *scanner = [NSScanner scannerWithString:subString]; 
    [scanner scanHexInt:&intValue]; 
    NSLog(@"LOCATION(%d) = %d", location, intValue); 
} 
[fakeData release]; 

加里

回答

1

不,NSScanner沒有掃描的十六進制字符的具體數量的機制。

你可以串數據2個字符的時間和對2字符字符串使用NSScanner:

NSString *fakeData = [[NSString alloc] initWithString:@"D8BE9831BC9617EB2954"]; 
unsigned int intValue; 

for (unsigned int start = 0; start+2 <= [fakeData length]; start += 2) { 
    NSRange nextRange = NSMakeRange(start, 2); 
    NSString *nextByte = [fakeData substringWithRange:nextRange]; 
    NSScanner *responseScanner = [NSScanner scannerWithString:nextByte]; 
    [responseScanner scanHexInt:&intValue]; 
    NSLog(@"HEX : %d", intValue);  
} 
相關問題