2012-01-10 70 views
1

我正在转换图像从选择器进入的NSData(JPEG表示),然后将其转换成用下面的代码字符串格式(XML中使用)保存图像..不工作

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

,并在的NSString另一端,我需要显示图像uiimage形成如下。

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

在顶部代码中使用的变量的图像不是nil,但是从数据形成的图像也越来越零...当我nslogged userdefaults一些字符串是本以上。可以任何人提到的密钥解释为什么是这是如此..什么是正确的方式来做到这一点

+0

你检查,如果[NSUTF8String和imagestring dataUsingEncoding] – viggio24 2012-01-10 14:06:28

+0

雅它返回零,而我用nsasciiencoding它返回一个非零值,但仍然图像是零 – sujith1406 2012-01-10 14:14:37

回答

2

如果它通过网络服务器或类似的东西,你可以用base64 enc /解码或其他一些普通的编码器封装它。

它删除“坏”字符,即在转换过程中拧紧字符串,并将其更改为通用字母字符,然后再返回。

如果是这种原因,您的问题,这里是一个简短的一个我使用(这是我最有可能偷和调整,但不从人记得了。对不起!:-))

base64helper.h

或返回nil包含了一些数据:
#import <Foundation/Foundation.h> 
    @interface NSData (MBBase64) 

base64helper.m

#import "base64helper.h" 

static const char encodingTable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/"; 

@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 
+0

谢谢兄弟!!!!!!有效!! – sujith1406 2012-01-10 14:35:12

+0

iOS7为此具有在NSData的类新方法 - (ID)initWithBase64EncodedString:(的NSString *)base64String选项:(NSDataBase64DecodingOptions)选项和 - (的NSString *)base64EncodedStringWithOptions:(NSDataBase64EncodingOptions)选项NS_AVAILABLE(10_9,7_0); – 2014-04-29 19:12:06

相关问题