gpt4 book ai didi

objective-c - 将 NSString 转换为 Base64 数据以进行 XML 序列化

转载 作者:数据小太阳 更新时间:2023-10-29 01:53:54 24 4
gpt4 key购买 nike

我使用 Apple 的 NSXMLParser 类来加载数据。我有一个单独的框架来序列化我的数据。

我已经受够了长破折号、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。加载起来效果很好,已经用汉字、Word字符等进行了测试。如果你愿意,你也可以把它们解析出来,但至少错误不在解析器中。 (错误处理不当很容易导致数据丢失。)

+ (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 转换为 Base64 数据以进行 XML 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4838263/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com