2012-12-19 161 views
3
NSData * data; 
NSFileHandle * file; 

file = [NSFileHandle fileHandleForReadingAtPath: @"script.txt"]; //this is wrong, as I have to provide a full pathname, but disregard for now 

[file seekToFileOffset: i]; //i not mentioned here, as this is only a snippet of code. Suffice to know that in the file it falls at the beginning of an integer I want to read 

data = [file readDataOfLength: 5]; //5-digit integer that I want to read 

現在我該如何將數據轉換爲可以使用的int數據(即執行算術運算)?Objective-C:將NSData轉換爲int或char

+1

script.txt是否包含整數的純文本(即ASCII)表示形式,正如人們可能從其名稱和文件擴展名中假設的那樣? –

+0

確實如此。 – Alexander

回答

5

因爲你是從文本文件閱讀您的整數,你可以將它轉換是這樣的:

char buf[6]; 
[data getBytes:buf length:5]; 
buf[5] = '\0'; 
NSInteger res = atoi(buf); 

這是假定每個字符使用一個字節編碼,這也符合[file readDataOfLength: 5]中的呼籲您提供的代碼片段。

如果位數是不是提前知道,你可以這樣做:

char buf[11]; // Max 10 digits in a 32-bit number + 1 for null terminator 
bzero(buf, 11); 
[data getBytes:buf length:variableLength]; 
NSInteger res = atoi(buf); 
+0

好的,謝謝。該文件是ASCII編碼的,所以它確實是每個字符一個字節。 – Alexander

+0

只是一個快速的後續問題: 假設我讀取的字節數不是一個常量(即在這種情況下是5),而是一個變量。然後,這種方法可能無法正常工作,因爲我無法用非常數元素聲明數組。那麼我的選擇是什麼? – Alexander

+0

@Alexander您可以聲明int的最大長度的數組(10位數+ 1代表終止零),用零填充它,然後調用'getBytes:length:'。看看編輯。 – dasblinkenlight

1

這樣做是將數據轉換爲一個NSString然後得到的整數值表示的一種方式:

// assuming UTF-8 encoding 
NSString *temp = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
int val = [temp intValue]; 

文檔以供參考: NSString

+0

如果我想從NSString獲取一個char值? – Alexander

+0

' - characterAtIndex:'將在給定的索引處返回一個「unichar」 – daegren

2

一點更普遍,你可以用這個貨幣或科學記數法,等,或爲int或這裏編碼浮點...

NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
NSNumberFormatter * format = [[NSNumberFormatter alloc] init]; 
[format setNumberStyle:NSNumberFormatterDecimalStyle]; 
NSNumber * myNumber = [format numberFromString:string]; 
0

如果我這樣做,假設script.txt包含純文本,我會使用NSScanner

NSError *error = nil; 
NSString *fileString = [NSString stringWithContentsOfFile:scriptPath encoding:NSUTF8StringEncoding error:&error]; 
if (!fileString) { // Handle error } 
NSScanner *scanner = [NSScanner scannerWithString:fileString]; 
[scanner setScanLocation:i]; 
int value = 0; 
if (![scanner scanInt:&value]) { // Unable to scan integer from string } 

// value should contain your integer here 
0

的NSData * dData;

const char * fData = [dData bytes];