How do I read an image from a byte array in Objective C?

Discussion in 'iOS Programming' started by Knight Rider, Jun 5, 2009.

  1. Knight Rider macrumors newbie

    Joined:
    May 14, 2009
    #1
    I'm getting a XML containing image which is base64 encoded.I've to decode that & need to display a image.Any suggestions.............
     
  2. robbieduncan Moderator emeritus

    robbieduncan

    Joined:
    Jul 24, 2002
    Location:
    London
  3. chingling macrumors newbie

    Joined:
    Nov 12, 2009
    #3
    Did you solve this problem with getting image from byte array? If yes can you help me?

    Thanks
     
  4. firewood macrumors 604

    Joined:
    Jul 29, 2003
    Location:
    Silicon Valley
    #4
    There is base64 decode code for the iPhone available from several blogs. Once you decode and get the raw image, you will need to know exactly what format it's in (compression, size, color depth, etc.)
     
  5. Knight Rider thread starter macrumors newbie

    Joined:
    May 14, 2009
    #5
    This may help ya

    #import <Foundation/NSString.h>

    @interface NSString (NSStringAdditions)

    + (NSString *) base64StringFromData:(NSData *)data length:(int)length;

    @end

    -------------------------------------------

    #import "NSStringAdditions.h"

    static char base64EncodingTable[64] = {
    'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
    'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
    'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
    'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'
    };

    @implementation NSString (NSStringAdditions)

    + (NSString *) base64StringFromData: (NSData *)data length: (int)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 = raw[ix];
    else
    input = 0;
    }
    put[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]]];

    for (i = ctcopy; i < 4; i++)
    [result appendString: @"="];

    ixtext += 3;
    charsonline += 4;

    if ((length > 0) && (charsonline >= length))
    charsonline = 0;

    return result;
    }

    @end

    ******For Base64 decoding:*********
    #import <Foundation/Foundation.h>

    @class NSString;

    @interface NSData (NSDataAdditions)

    + (NSData *) base64DataFromString:(NSString *)string;

    -------------------------------------------

    #import "NSDataAdditions.h"

    @implementation NSData (NSDataAdditions)

    + (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;

    output[0] = (input[0] << 2) | ((input[1] & 0x30) >> 4);
    output[1] = ((input[1] & 0x0F) << 4) | ((input[2] & 0x3C) >> 2);
    output[2] = ((input[2] & 0x03) << 6) | (input[3] & 0x3F);

    for (i = 0; i < ctcharsinput; i++)
    [result appendBytes: &output length: 1];
    }

    if (flbreak)
    break;
    }
    return result;
    }

    @end
     

Share This Page