简体   繁体   中英

Why can't I parse an image from an XML file using this code from my iPhone application?

I'm having trouble importing image data which is encoded in an XML file. Following is the code of my class where I read the XML file and try to get the photo from the encoded data.

edit 1

I haven't any errors but I always get an empty value on "artXML.photo"....

Can anyone point out what might be going wrong?

-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {

    valoreLetto = [valoreLetto stringByAppendingString:string];
}

-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName 
  namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
{

    if([elementName isEqualToString:@"photo"]) {

        NSData *aData;
        aData = [NSData dataWithBase64EncodedString:valoreLetto];

        //valoreLetto contains a value like X'FFD8FFE000....', from the blob representation of an image

        artXML.photo = [UIImage imageWithData:aData];
    }

}

@end

@interface NSData (ParserXmlArticoli)

-(id)dataWithBase64EncodedString:(NSString *)string;   
-(NSString *)base64Encoding;
@end


static const char encodingTable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";


@implementation NSData (ParserXmlArticoli)

-(id)dataWithBase64EncodedString:(NSString *)string;
{

    if (string == nil)
        [NSException raise:NSInvalidArgumentException format:nil];
    if ([string length] == 0)
        return [NSData data];

    static char *decodingTable = NULL;
    if (decodingTable == NULL)
    {

        decodingTable = malloc(256);
        if (decodingTable == NULL)
            return nil;
        memset(decodingTable, CHAR_MAX, 256);
        NSUInteger i;
        for (i = 0; i < 64; i++)
            decodingTable[(short)encodingTable[i]] = i;
    }

    const char *characters = [string cStringUsingEncoding:NSASCIIStringEncoding];
    if (characters == NULL)  
        return nil;
    char *bytes = malloc((([string length] + 3) / 4) * 3);
    if (bytes == NULL)
        return nil;
    NSUInteger length = 0;

    NSUInteger i = 0;
    while (YES)

    {

        char buffer[4];
        short bufferLength;
        for (bufferLength = 0; bufferLength < 4; i++)
        {

            if (characters[i] == '\0')
                break;
            if (isspace(characters[i]) || characters[i] == '=')
                continue;
            buffer[bufferLength] = decodingTable[(short)characters[i]];
            if (buffer[bufferLength++] == CHAR_MAX)      
            {

                free(bytes);
                return nil;

            }

        }

        if (bufferLength == 0)
            break;
        if (bufferLength == 1)

        {

            free(bytes);
            return nil;

        }

        bytes[length++] = (buffer[0] << 2) | (buffer[1] >> 4);
        if (bufferLength > 2)
            bytes[length++] = (buffer[1] << 4) | (buffer[2] >> 2);
        if (bufferLength > 3)
            bytes[length++] = (buffer[2] << 6) | buffer[3];

    }

    realloc(bytes, length);
    return [NSData dataWithBytesNoCopy:bytes length:length];

}

-(NSString *)base64Encoding;

{

if ([self length] == 0)
        return @"";

    char *characters = malloc((([self length] + 2) / 3) * 4);
    if (characters == NULL)
        return nil;
    NSUInteger length = 0;

    NSUInteger i = 0;
    while (i < [self length])

    {

                char buffer[3] = {0,0,0};
        short bufferLength = 0;
        while (bufferLength < 3 && i < [self length])
            buffer[bufferLength++] = ((char *)[self bytes])[i++];

        characters[length++] = encodingTable[(buffer[0] & 0xFC) >> 2];
        characters[length++] = encodingTable[((buffer[0] & 0x03) << 4) | ((buffer[1] & 0xF0) >> 4)];
        if (bufferLength > 1)
            characters[length++] = encodingTable[((buffer[1] & 0x0F) << 2) | ((buffer[2] & 0xC0) >> 6)];
        else characters[length++] = '=';
        if (bufferLength > 2)
            characters[length++] = encodingTable[buffer[2] & 0x3F];
        else characters[length++] = '=';

    }

    return [[[NSString alloc] initWithBytesNoCopy:characters length:length encoding:NSASCIIStringEncoding freeWhenDone:YES] autorelease];

}

@end

I assume you mean from a string or input stream. Check this earlier thread: Reading binary image data from a web service into UIImage

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM