2013-07-03 17 views
-1

在服务器中,图像以二进制格式存储。我必须使用json在iphone中检索图像。我怎样才能做到这一点?是否有可能使用NSData来做到这一点?如何在服务器中以二进制格式在iPhone中检索图像

+0

API后端哪种语言使用php或其他东西 –

+0

你为什么不接受答案?有什么不对吗? – 2014-01-13 05:26:05

回答

0

您必须使用json解析从服务器获取二进制值,然后将该字符串转换为NSData。

这是用于将base64字符串转换为NSData的标准代码。

//MBBase64.h 

@interface NSData (MBBase64) 

+ (id)dataWithBase64EncodedString:(NSString *)string;  // Padding '=' characters are optional. Whitespace is ignored. 

@end 


//MBBase64.m 

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]; 
} 

@end 

然后加载导致的NSData中的UIImageView

yourimageview.image = [[UIImage alloc] initWithData:resultdata]; 
1

是的,你需要的二进制数据隐蔽到NSData的是这样的:

NSData *imgData = [NSData dataWithBase64EncodedString:yourelement]; 
UIImage *theImg = [UIImage imageWithData:imgData]; 

您需要MBBase64类,这是可以在这里:https://github.com/jerrykrinock/CategoriesObjC

相关问题