2011-01-29 23 views
5

के लिए एनएसएसटींग को बेस 64 डेटा में कनवर्ट करना मैं डेटा लोड करने के लिए ऐप्पल के NSXMLParser क्लास का उपयोग करता हूं। मेरे डेटा को क्रमबद्ध करने के लिए मेरे पास एक अलग ढांचा है।एक्सएमएल सीरियलाइजेशन

मेरे पास लंबे समय तक डैश, वर्ड कोट्स इत्यादि हैं जो मेरे एक्सएमएल आउटपुट में दिख रहे हैं और पार्सिंग करते समय त्रुटियों का कारण बनते हैं, जो अक्सर उन पात्रों के पार्सर के खराब प्रबंधन के कारण डेटा हानि का परिणाम होता है।

यदि मेरे पास एनएसएसटींग ऑब्जेक्ट के रूप में उपयोगकर्ता का इनपुट है, तो मैं इसे बेस 64 (जिसे मेरे पास उपयोगिता विधि है) में परिवर्तित करना चाहता हूं, फिर एनएसएसटींग के स्थान पर उन बाइट्स को XML फ़ाइल में लिखें। मैं समझता हूं कि यह और अधिक जगह ले सकता है, लेकिन कम से कम मुझे सत्यापन मुद्दों से निपटने की ज़रूरत नहीं है।

मेरे सवाल यह है कि एक एन्कोडिंग का उपयोग मूल मूल्य वापस पाने के लिए के बिना एक NSString, को NSData बाइट्स (जो एक NSLog बयान में <8d72...> की तरह लग रहे) को परिवर्तित करने के बारे में जाना है, है। मैं उन वास्तविक बाइट्स चाहता हूं, क्योंकि वे लॉग स्टेटमेंट में दिखाई देते हैं, जिन्हें एनएसएसटींग में परिवर्तित किया जाता है। और अंत में (जब यह धारावाहिक डेटा लोड हो रहा), यदि आप एक NSString है:

NSString *loadedData = @"8d72..."; 

कैसे एक मानव पठनीय प्रारूप करने के लिए इस प्रपत्र से जाता है? पूरी एन्कोडिंग प्रक्रिया मेरे लिए समझना थोड़ा मुश्किल है, लेकिन मुझे लगता है कि यह सुनिश्चित करने का एक ठोस तरीका है कि अजीब उपयोगकर्ता इनपुट मेरी एक्सएमएल फाइलों में ठीक से जारी है।

उत्तर

11

समझ गया। मैं इस सवाल का जवाब से एन्कोडिंग/डिकोडिंग तरीकों का उपयोग कर रहा हूँ NSData वस्तुओं के लिए मेरी NSString वस्तुओं कन्वर्ट करने के लिए, और इसके विपरीत: Any base64 library on iphone-sdk?

और फिर मैं इन त्वरित तरीकों कि उपरोक्त विधियों का उपयोग करने के लिए लिखा था, और मुझे करने की अनुमति एक्सएमएल में बेस 64 स्ट्रिंग डेटा लिखें। इसे लोड करना बहुत अच्छा काम करता है, चीनी वर्णों, शब्द वर्णों आदि के साथ परीक्षण किया गया है। यदि आप चाहें तो आप इन्हें भी पार्स कर सकते हैं, लेकिन कम से कम त्रुटि पार्सर में नहीं है। (जो आसानी से डेटा हानि हो सकती थी अगर आप त्रुटियों ठीक से संभाल नहीं है।)

+ (NSString *)toBase64String:(NSString *)string { 
    NSData *data = [string dataUsingEncoding: NSUnicodeStringEncoding]; 

    NSString *ret = [NSStringUtil base64StringFromData:data length:[data length]]; 

    return ret; 
} 

+ (NSString *)fromBase64String:(NSString *)string { 
    NSData *base64Data = [NSStringUtil base64DataFromString:string]; 

    NSString* decryptedStr = [[NSString alloc] initWithData:base64Data encoding:NSUnicodeStringEncoding]; 

    return [decryptedStr autorelease]; 
} 

संपादित करें: मूल लिंक नीचे है, मैं नीचे मेरी कोड थोड़ी देर पहले से शिकार किया, यहाँ हैं मेरे उपरोक्त वर्णित NSStringUtil विधियां। नोट मैंने इस कोड को लेखक नहीं बनाया है, लेकिन यह वर्षों से अच्छी तरह से काम कर रहा है:

+ (NSData *)base64DataFromString: (NSString *)string { 
    unsigned long ixtext, lentext; 
    unsigned char ch, input[4], output[3]; 
    short i, ixinput; 
    Boolean flignore, flendtext = false; 
    const char *temporary; 
    NSMutableData *result; 

    if (!string) { 
     return [NSData data]; 
    } 

    ixtext = 0; 

    temporary = [string UTF8String]; 

    lentext = [string length]; 

    result = [NSMutableData dataWithCapacity: lentext]; 

    ixinput = 0; 

    while (true) { 
     if (ixtext >= lentext) { 
      break; 
     } 

     ch = temporary[ixtext++]; 

     flignore = false; 

     if ((ch >= 'A') && (ch <= 'Z')) { 
      ch = ch - 'A'; 
     } else if ((ch >= 'a') && (ch <= 'z')) { 
      ch = ch - 'a' + 26; 
     } else if ((ch >= '0') && (ch <= '9')) { 
      ch = ch - '0' + 52; 
     } else if (ch == '+') { 
      ch = 62; 
     } else if (ch == '=') { 
      flendtext = true; 
     } else if (ch == '/') { 
      ch = 63; 
     } else { 
      flignore = true; 
     } 

     if (!flignore) { 
      short ctcharsinput = 3; 
      Boolean flbreak = false; 

      if (flendtext) { 
       if (ixinput == 0) { 
        break; 
       } 

       if ((ixinput == 1) || (ixinput == 2)) { 
        ctcharsinput = 1; 
       } else { 
        ctcharsinput = 2; 
       } 

       ixinput = 3; 

       flbreak = true; 
      } 

      input[ixinput++] = ch; 

      if (ixinput == 4) { 
       ixinput = 0; 

       unsigned char0 = input[0]; 
       unsigned char1 = input[1]; 
       unsigned char2 = input[2]; 
       unsigned char3 = input[3]; 

       output[0] = (char0 << 2) | ((char1 & 0x30) >> 4); 
       output[1] = ((char1 & 0x0F) << 4) | ((char2 & 0x3C) >> 2); 
       output[2] = ((char2 & 0x03) << 6) | (char3 & 0x3F); 

       for (i = 0; i < ctcharsinput; i++) { 
        [result appendBytes: &output[i] length: 1]; 
       } 
      } 

      if (flbreak) { 
       break; 
      } 
     } 
    } 

    return result; 
} 

+ (NSString *)base64StringFromData: (NSData *)data length: (NSUInteger)length { 
    unsigned long ixtext, lentext; 
    long ctremaining; 
    unsigned char input[3], output[4]; 
    short i, charsonline = 0, ctcopy; 
    const unsigned char *raw; 
    NSMutableString *result; 

    lentext = [data length]; 

    if (lentext < 1) { 
     return @""; 
    } 

    result = [NSMutableString stringWithCapacity: lentext]; 

    raw = [data bytes]; 

    ixtext = 0; 

    while (true) { 
     ctremaining = lentext - ixtext; 

     if (ctremaining <= 0) { 
      break; 
     } 

     for (i = 0; i < 3; i++) { 
      unsigned long ix = ixtext + i; 

      if (ix < lentext) { 
       input[i] = raw[ix]; 
      } else { 
       input[i] = 0; 
      } 
     } 

     output[0] = (input[0] & 0xFC) >> 2; 
     output[1] = ((input[0] & 0x03) << 4) | ((input[1] & 0xF0) >> 4); 
     output[2] = ((input[1] & 0x0F) << 2) | ((input[2] & 0xC0) >> 6); 
     output[3] = input[2] & 0x3F; 

     ctcopy = 4; 

     switch (ctremaining) { 
      case 1: 
       ctcopy = 2; 
       break; 
      case 2: 
       ctcopy = 3; 
       break; 
     } 

     for (i = 0; i < ctcopy; i++) { 
      [result appendString: [NSString stringWithFormat: @"%c", base64EncodingTable[output[i]]]]; 
     } 

     for (i = ctcopy; i < 4; i++) { 
      [result appendString: @"="]; 
     } 

     ixtext += 3; 
     charsonline += 4; 

     if ((ixtext % 90) == 0) { 
      [result appendString: @"\n"]; 
     } 

     if (length > 0) { 
      if (charsonline >= length) { 
       charsonline = 0; 

       [result appendString: @"\n"]; 
      } 
     } 
    } 

    return result; 
} 
+1

क्या हमें NSStringUtil का उपयोग करने के लिए कोई ढांचा आयात करना है ???? –

+0

'NSStringUtil' एक वर्ग है जिसे मैंने लिखा है जिसमें केवल 'base64DataFromString:' और' base64StringFromData: 'विधियां हैं जो मेरे उत्तर में दिए गए लिंक में वर्णित हैं। –

+0

क्या आप कृपया मुझे दिखा सकते हैं कि NSStringUtil क्लास .... मैं अपने बेस 64 को एनएसएसटींग में परिवर्तित करना चाहता हूं .... लेकिन मुझे NSStringUtil के लिए त्रुटि मिल रही है। –

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