objective-c – 将NSString转换为用于XML序列化的Base64数据

objective-c – 将NSString转换为用于XML序列化的Base64数据,第1张

概述我使用Apple的NS XMLParser类来加载数据.我有一个单独的框架来序列化我的数据. 我已经有足够的长字符,Word引号等出现在我的XML输出中并在解析时导致错误,这通常会导致数据丢失,因为解析器对这些字符的处理不当. 如果我将用户的输入作为NSString对象,我想将其转换为Base64(我有一个实用工具方法),然后将这些字节写入XML文件,代替NSString.我知道这可能会占用更多空 我使用Apple的NS XMLParser类来加载数据.我有一个单独的框架来序列化我的数据.

我已经有足够的长字符,Word引号等出现在我的XML输出中并在解析时导致错误,这通常会导致数据丢失,因为解析器对这些字符的处理不当.

如果我将用户的输入作为Nsstring对象,我想将其转换为Base64(我有一个实用工具方法),然后将这些字节写入XML文件,代替Nsstring.我知道这可能会占用更多空间,但至少我不再需要处理验证问题了.

我的问题是,如何将NSData字节(在NSLog语句中看起来像< 8d72 ...>)转换为Nsstring,而不使用编码来获取原始值.我希望将那些出现在日志语句中的实际字节转换为Nsstring.最后(加载此序列化数据时),如果您有Nsstring:

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

如何从这种形式转变为人类可读的格式?整个编码过程对我来说有点难以理解,但我认为这是确保在我的XML文件中正确保留奇怪的用户输入的一种非常可靠的方法.

解决方法 得到它了.我正在使用此答案中的编码/解码方法将我的Nsstring对象转换为NSData对象,反之亦然:
Any base64 library on iphone-sdk?

然后我编写了这些使用上述方法的快速方法,并允许我将Base64字符串数据写入XML.加载效果很好,已经过中文字符,单词字符等测试.如果需要,也可以解析这些,但至少错误不在解析器中. (如果您没有正确处理错误,很容易导致数据丢失.)

+ (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;}
总结

以上是内存溢出为你收集整理的objective-c – 将NSString转换为用于XML序列化的Base64数据全部内容,希望文章能够帮你解决objective-c – 将NSString转换为用于XML序列化的Base64数据所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1015174.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存