2011-09-07 40 views
17

我有一個NSData對象,長度爲4個字節。這些四個字節我是來自另一個NSData對象使用提取,NSData的轉換成int

fourByteData=[completeData subdataWithRange:NSMakeRange(0, 16)]; 

我的第一個問題是,上面的語句提供我是完整數據的前四個字節。

如果是,那麼如何將所有這些字節轉換爲等效的int。

+0

根據數據的來源,您可能需要考慮數據的字節順序。如果數據被創建並且只能在你的代碼中傳輸,那麼你會很好,否則你需要知道小/大的字節序。 – Joe

+0

[將NSdata轉換爲字節並將前n個字節轉換爲int]可能的重複(http://stackoverflow.com/questions/7330436/converting-nsdata-to-bytes-then-converting-the-first-n- bytes-to-int) –

回答

30

是268566528您所期望的價值或者你希望528?如果正確的值是528,那麼字節順序是big-endian,但cpu是little-endian,字節需要顛倒。

所以,如果正確的值應該是528,那麼:

NSData *data4 = [completeData subdataWithRange:NSMakeRange(0, 4)]; 
int value = CFSwapInt32BigToHost(*(int*)([data4 bytes])); 

還要注意,網絡標準順序是大端。

22

這種說法會給你第一個16個字節的數據,而不是4.要得到你需要修改語句前4個字節:

fourByteData = [completeData subdataWithRange:NSMakeRange(0, 4)]; 

要閱讀從NSData對象所涉及的數據整數你可以這樣做:

int theInteger; 
[completeData getBytes:&theInteger length:sizeof(theInteger)]; 

如果你只是把它轉換爲一個整數,你不需要得到前4個字節。您可以直接從上述兩行執行此操作,並且您的completeData接收器

+0

完美的解決方案,這種方式一步即可完成LSB(iOS準備就緒) –

11

否您將獲得16個字節的數據,因爲範圍是從偏移量0開始,然後是16個字節。

如果你有一個NSData實例與4個字節,那麼你可以做一個簡單的類型轉換是這樣的:

int value = *(int*)([data bytes]); 
+0

四字節數據<00000210> int值:268566528我得到以下這個數據的int輸出。這是正確的........只是想知道。 –

+0

@Pranav - 取決於你的'NSData'實例中數據的字節順序是什麼? – PeyloW

+0

這工作完美。 – rjgonzo

5
- (unsigned)parseIntFromData:(NSData *)data{ 

    NSString *dataDescription = [data description]; 
    NSString *dataAsString = [dataDescription substringWithRange:NSMakeRange(1, [dataDescription length]-2)]; 

    unsigned intData = 0; 
    NSScanner *scanner = [NSScanner scannerWithString:dataAsString]; 
    [scanner scanHexInt:&intData]; 

    return intData; 
} 

int numberOfChunks = [self parseIntFromData:data]; 
+0

迄今爲止的最佳解決方案 –

4

iOS整數存儲第一個字節的LSB(最低有效字節)和最後一個字節的MSB。我有轉換例程來測試所有這些事情。點擊這裏,

測試...

int i = 2342342; 
    NSData * d1 = [Util dataFromInt:i]; // {[MSB], ..., ... ,[LSB]} <0023bdc6> 
    NSData * d2 = [NSData dataWithBytes:&i length:4]; // {[LSB], ..., ... ,[MSB]} <c6bd2300> 
    int ci1 = [Util intFromData:d1]; 
    int ci2 = [Util intFromDataReverse:d2]; 

Util.m

+ (NSData *) dataFromInt:(int)num { 
    unsigned char * arr = (unsigned char *) malloc(sizeof(num) * sizeof(unsigned char)); 
    for (int i = sizeof(num) - 1 ; i >= 0; i --) { 
     arr[i] = num & 0xFF; 
     num = num >> 8; 
    } 
    NSData * data = [NSData dataWithBytes:arr length:sizeof(num)]; 
    free(arr); 
    return data; 
} 

// {[MSB], ..., ... ,[LSB]} 
+ (int) intFromData:(NSData *)data 
{ 
    int intSize = sizeof(int); // change it to fixe length 
    unsigned char * buffer = malloc(intSize * sizeof(unsigned char)); 
    [data getBytes:buffer length:intSize]; 
    int num = 0; 
    for (int i = 0; i < intSize; i++) { 
     num = (num << 8) + buffer[i]; 
    } 
    free(buffer); 
    return num; 
} 

// {[LSB], ..., ... ,[MSB]} 
+ (int) intFromDataReverse:(NSData *)data 
{ 
    int intSize = sizeof(int);// change it to fixe length 
    unsigned char * buffer = malloc(intSize * sizeof(unsigned char)); 
    [data getBytes:buffer length:intSize]; 
    int num = 0; 
    for (int i = intSize - 1; i >= 0; i--) { 
     num = (num << 8) + buffer[i]; 
    } 
    free(buffer); 
    return num; 
} 
+0

太棒了!特別是如果有人正在尋找跨平臺的解決方案。 –

1

這取決於你要轉換的數據的字節序標記,在關係到您的設備字節序的符號。 wiki on Endianness

要保持它,你需要檢查完成兩法

NSData *data4 = [completeData subdataWithRange:NSMakeRange(0, 4)]; 
int value = CFSwapInt32BigToHost(*(int*)([data4 bytes])); 

NSData *data4 = [completeData subdataWithRange:NSMakeRange(0, 4)]; 
int value = CFSwapInt32LittleToHost(*(int*)([data4 bytes])); 

並檢查當您分析數據哪一個更有意義的簡單。