如何在 iOS 中使用 base64 编码将无符号短整数数组添加到 XML 文件
How to add array of unsigned short integers to XML file with base64 encoding in iOS
我有 6 个无符号短数组,长度为 65536 个值。每个都需要添加到 XML 文件中的 6 个对应元素。到目前为止,我可以成功(我认为)对所有数组进行编码并将它们写入 xml 文件。然后我可以读取 xml 文件并仅解码前 5 个数组。第 6 个有问题。
这是我的编码和解码函数:
-(NSString*)encodeArrayToBase64String:(unsigned short*)ArrayofUnsignedShorts
{
NSData *DataArray = [[NSData alloc] ArrayofUnsignedShorts length:(65536*2)];
NSString *base64Encoded = [DataArray base64EncodedStringWithOptions:(NSDataBase64Encoding64CharacterLineLength | NSDataBase64EncodingEndLineWithLineFeed)];
return base64Encoded;
}
-(void)decodeBase64StringToArrayData:(NSString*)encodedString
{
//get array storage location
unsigned short *CurrentArray = [self getCurrentArray];
NSData *DataArray = [[NSData alloc]initWithBase64EncodedString:encodedString options:NSDataBase64DecodingIgnoreUnknownCharacters];
void *bytes = [DataArray bytes];
for (NSUInteger i = 0; i < [DataArray length]; i += 2) {
unsigned short elem = OSReadLittleInt16(bytes, i);
CurrentArray[i/2] = elem;
}
}
解码第 6 个数组时,DataArray 从 initWithBase64EncodedString 获取 "nil",但字符串包含字符。我读到这可能是 xml 文件中不应出现的空字符引起的,但我不明白为什么它们会在那里。这是我第一次在 xml 转换中使用 base64encoding,因此感谢任何其他处理此问题的一般建议。
我不知道我是否忽略了什么,但我想我已经解决了问题。在这个过程中的某个地方有字符串终止字符被添加到 xml 文件中(仍然不知道为什么会这样......)所以我添加了代码以更好地处理我的 NSXMLParser.
简化代码:
NSString *Base64EncodedString;
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
//reset string for the start of new xml element
Base64EncodedString = @"";
}
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
//added characters to the total found characters of this xml element
Base64EncodedString = [Base64EncodedString stringByAppendingString:string];
}
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
//decoded all characters of the current xml element
[self decodeBase64StringToArrayData:Base64EncodedString];
}
之前我在 foundCharacters 中调用 decodeBase64StringtoArrayData。
我有 6 个无符号短数组,长度为 65536 个值。每个都需要添加到 XML 文件中的 6 个对应元素。到目前为止,我可以成功(我认为)对所有数组进行编码并将它们写入 xml 文件。然后我可以读取 xml 文件并仅解码前 5 个数组。第 6 个有问题。
这是我的编码和解码函数:
-(NSString*)encodeArrayToBase64String:(unsigned short*)ArrayofUnsignedShorts
{
NSData *DataArray = [[NSData alloc] ArrayofUnsignedShorts length:(65536*2)];
NSString *base64Encoded = [DataArray base64EncodedStringWithOptions:(NSDataBase64Encoding64CharacterLineLength | NSDataBase64EncodingEndLineWithLineFeed)];
return base64Encoded;
}
-(void)decodeBase64StringToArrayData:(NSString*)encodedString
{
//get array storage location
unsigned short *CurrentArray = [self getCurrentArray];
NSData *DataArray = [[NSData alloc]initWithBase64EncodedString:encodedString options:NSDataBase64DecodingIgnoreUnknownCharacters];
void *bytes = [DataArray bytes];
for (NSUInteger i = 0; i < [DataArray length]; i += 2) {
unsigned short elem = OSReadLittleInt16(bytes, i);
CurrentArray[i/2] = elem;
}
}
解码第 6 个数组时,DataArray 从 initWithBase64EncodedString 获取 "nil",但字符串包含字符。我读到这可能是 xml 文件中不应出现的空字符引起的,但我不明白为什么它们会在那里。这是我第一次在 xml 转换中使用 base64encoding,因此感谢任何其他处理此问题的一般建议。
我不知道我是否忽略了什么,但我想我已经解决了问题。在这个过程中的某个地方有字符串终止字符被添加到 xml 文件中(仍然不知道为什么会这样......)所以我添加了代码以更好地处理我的 NSXMLParser.
简化代码:
NSString *Base64EncodedString;
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
//reset string for the start of new xml element
Base64EncodedString = @"";
}
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
//added characters to the total found characters of this xml element
Base64EncodedString = [Base64EncodedString stringByAppendingString:string];
}
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
//decoded all characters of the current xml element
[self decodeBase64StringToArrayData:Base64EncodedString];
}
之前我在 foundCharacters 中调用 decodeBase64StringtoArrayData。