сохранение изображений в строковом формате (для использования в xml).. не работает

я преобразовываю изображение из средства выбора в nsdata (представление jpeg), а затем преобразовываю его в nsstring, используя следующий код

 NSData *data=UIImageJPEGRepresentation(image,1.0);
 NSString *imageString=[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
[[NSUserDefaults standardUserDefaults] setObject:imageString forKey:@"image_name"];

а на другом конце, где мне нужно отобразить изображение, uiimage формируется следующим образом.

 NSString *imageString=[[NSString alloc] init];
 imageString=[[NSUserDefaults standardUserDefaults] objectForKey:@"image_name"];
 UIImage *image=[UIImage imageWithData:[imageString dataUsingEncoding:NSUTF8StringEncoding]];

переменная изображения, используемая в верхнем коде, не равна нулю, но изображение, сформированное из данных, становится равным нулю... когда в nslogged userdefaults присутствует некоторая строка для ключа, упомянутого выше. может ли кто-нибудь объяснить, почему это так... что это такое правильный способ сделать это


person sujith1406    schedule 10.01.2012    source источник
comment
Вы проверили, возвращает ли [imageString dataUsingEncoding: NSUTF8String] ноль или содержит некоторые данные?   -  person viggio24    schedule 10.01.2012
comment
да, он возвращает ноль, в то время как я использовал nsasciiencoding, он возвращает ненулевое значение, но изображение все равно равно нулю   -  person sujith1406    schedule 10.01.2012


Ответы (1)


Если он проходит через веб-сервер или что-то подобное, вы можете инкапсулировать его с помощью base64 enc/decoding или какого-либо другого простого кодировщика.

Он удаляет "плохие" символы, т.е. те, которые искажают строку во время преобразования, и заменяет их на общие алфавитные символы, а затем обратно.

если это причина ваших проблем, вот короткая, которую я использую (которую я, скорее всего, украл и адаптировал, но не помню у кого. Извините! :-))

base64helper.h

    #import <Foundation/Foundation.h>
    @interface NSData (MBBase64)

base64helper.m

#import "base64helper.h"

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

@implementation NSData (MBBase64)

+ (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)     //  Not an ASCII string!
        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)      //  Illegal character!
            {
                free(bytes);
                return nil;
            }
        }

        if (bufferLength == 0)
            break;
        if (bufferLength == 1)      //  At least two characters are needed to produce one byte!
        {
            free(bytes);
            return nil;
        }

        //  Decode the characters in the buffer to bytes.
        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++];

        //  Encode the bytes in the buffer to four characters, including padding "=" characters if necessary.
        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
person zeAttle    schedule 10.01.2012
comment
iOS7 имеет новые методы для этой цели в классе NSData - (id) initWithBase64EncodedString: (NSString *) base64String options: (NSDataBase64DecodingOptions) options и - (NSString *) base64EncodedStringWithOptions: (NSDataBase64EncodingOptions) options NS_AVAILABLE (10_9, 7_0); - person Vishal Singh; 29.04.2014