2011-09-07 15 views
17

int करने के लिए मैंने एक NSData वस्तु की लंबाई चार बाइट्स मैं एक और NSData वस्तु से निकालने कर रहा हूँ का उपयोग कर, ये 4 बाइट हैपरिवर्तित NSData

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

मेरा पहला सवाल यह है कि, ऊपर बयान प्रदान करेगा मुझे पूरा डेटा के पहले चार बाइट्स।

यदि हां, तो इन सभी बाइट्स को समकक्ष int में कैसे परिवर्तित करें।

+0

डेटा की उत्पत्ति के आधार पर, आपको डेटा की अंतहीनता को ध्यान में रखना पड़ सकता है।यदि डेटा बनाया गया है और केवल आपके कोड में स्थानांतरित किया गया है तो आप ठीक होंगे, अन्यथा आपको छोटे/बड़े एंडियन के बारे में पता होना चाहिए। – Joe

+0

संभावित डुप्लिकेट [NSData को बाइट्स में कनवर्ट करना और फिर पहले एन बाइट्स को int में परिवर्तित करना] (http://stackoverflow.com/questions/7330436/converting-nsdata-to-bytes-then-converting-the-first-n- बाइट्स-टू-इंट) –

उत्तर

30

268566528 मूल्य जैसा कि आप उम्मीद है या शायद आप 528 उम्मीद करते हैं? यदि सही मूल्य 528 है तो बाइट ऑर्डर बड़ा-एंडियन है लेकिन सीपीयू थोड़ा-एंडियन है, बाइट्स को उलट करने की आवश्यकता है।

तो, अगर सही मान 528 तो होना चाहिए:

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

भी ध्यान रखें कि नेटवर्क मानक आदेश बड़े endian है।

22

यही बयान आप डेटा के पहले 16 बाइट्स, 4. पहले 4 बाइट्स आप करने के लिए अपने बयान संशोधित करने की जरूरत प्राप्त करने के लिए देना होगा नहीं:

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

एक को NSData वस्तु से डेटा को पढ़ने के लिए

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

आप अगर आप सिर्फ एक पूर्णांक के लिए इसे परिवर्तित कर रहे हैं पहले 4 बाइट्स प्राप्त करने की आवश्यकता नहीं है: आप की तरह कुछ कर सकता है पूर्णांक। आप इसे उपर्युक्त दो पंक्तियों से सीधे कर सकते हैं और completeData रिसीवर

+0

सही समाधान, इस तरह से डेटा एक चरण –

11

नहीं, आपको डेटा के 16 बाइट मिलेगा, क्योंकि सीमा ऑफसेट 0 और फिर 16 बाइट्स से है।

यदि आप 4 बाइट के साथ एक NSData उदाहरण तो आप एक सरल प्रकार इस तरह डाली कर सकता था:

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

आईओएस पूर्णांक भंडार पहले बाइट और पिछले बाइट में MSB में LSB (सबसे कम महत्वपूर्ण बाइट)। मेरे पास उन सभी चीजों का परीक्षण करने के लिए रूपांतरण दिनचर्या है। यहाँ की जाँच करें,

टेस्ट ...

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

यह आपके डिवाइस endianness अंकन के संबंध में डेटा आप परिवर्तित करना चाहते हैं की endianness अंकन पर निर्भर करता है,। 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])); 

और जाँच करता है जो एक और मतलब जब आप डेटा पार्स की जरूरत है रखने के लिए।

संबंधित मुद्दे