代码之家  ›  专栏  ›  技术社区  ›  ravinsp

将二进制图像数据从web服务读入UIImage

  •  4
  • ravinsp  · 技术社区  · 15 年前

    我正在iPhone应用程序中使用web服务。web服务方法返回一个包含多个字段(例如ID、描述等)的响应。其中一个字段包含我需要在iPhone应用程序中将其转换为UIImage的二进制图像数据。

    我正在使用NSXMLParser成功地从XML响应中提取数据。在 parser:foundCharacters: XMLParser的选择器,它给出 NSString* 指向每个字段中的字符串。因为这是一个字符串,所以当我遇到图像字段时,我会这样读取图像数据:

    UIImage *img = [[UIImage alloc] initWithData:[string dataUsingEncoding:NSUTF8StringEncoding]];
    

    但在这一行之后,img变量仍然是“nil”。XML字符串中的数据似乎与转换不兼容。我做错了什么(我可以将其他字段读入变量,但不能读入此图像数据字段)

    提前谢谢。。

    2 回复  |  直到 15 年前
        1
  •  5
  •   ravinsp    15 年前

    根据fbrereto的回答,我在这个链接上使用代码示例成功地将字符串转换为NSData: http://www.cocoadev.com/index.pl?BaseSixtyFour

    它使用objective-c类别添加选择器 + (id)dataWithBase64EncodedString:(NSString *)string;

    //MBBase64.h
    
    @interface NSData (MBBase64)
    
    + (id)dataWithBase64EncodedString:(NSString *)string;     //  Padding '=' characters are optional. Whitespace is ignored.
    
    @end
    
    
    //MBBase64.m
    
    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];
    }
    
    @end
    

    谢谢大家!!

        2
  •  1
  •   fbrereto    15 年前

    骗局 NSString 存在与其包含的数据关联的隐式编码。但是,您正在接收的图像的格式可能无法正确转换,因为它是二进制数据或二进制数据的某种无损编码(例如base64)。那么,诀窍就是确保你不会让 NSString dataUsingEncoding: 我会尝试一个更像 getBytes:maxLength:usedLength:encoding:options:range:remainingRange . 虽然比 只是数据 从NSString中,仅此而已。