tags:

views:

115

answers:

2

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
A: 

I assume you mean from a string or input stream. Check this earlier thread: http://stackoverflow.com/questions/2360986/reading-binary-image-data-from-a-web-service-into-uiimage

Peter DeWeese
I try to explain better. I have for example the value - X'FFD8FFE000104....FFD9' - into a NSString and then I have to obtain a UIImage from it.
Andrea Mattiuz
Hmm. It still sounds like that other question. It appears that you have base64 encoded data in a string, just like the previous question. Code is posted both for converting the string and using it as an image. Check the link!
Peter DeWeese
Sorry for my ignorance, and also for my insistence, but it doesn't work! Seems like I'm missing something with that code, because the image isn't created! Can I simply use that method in my own class?
Andrea Mattiuz
Paste your implementation starting with how you get the data. Maybe it'll help someone figure it out!
Peter DeWeese
Sorry, I wonder if the problem is with the size of the string to convert because I can't figure it out. Does it work even if the string is very long? Or needs some changes?
Andrea Mattiuz
A: 

Someone can tell me why and where I'm wrong??

Andrea Mattiuz