我是耗费一个网络服务在我的iPhone应用程序。该网服务的方法返回答其中有几个领域(例如。标识、描述等等..).这些领域包含二进制数据图像我需要转换为UIImage在我的iPhone应用程序。

我使用一个NSXMLParser成功地从中提取数据XML响应。在 parser:foundCharacters: 选择的XMLParser,它提供了一个 NSString* 指向串内的各个领域。由于这是一个串,这是我做什么我读取图像数据时我会遇到的图像的领域:

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

但img变量仍然是"无"之后的这条路线。似乎是该数据从XML string是不兼容的转换。我做错了这里?(我能读其他领域进入我的变量,但没有这个图像数据字段)

在此先感谢..

有帮助吗?

解决方案

以下fbrereto的答案,我设法把串入NSData使用代码样本在此链接: http://www.cocoadev.com/index.pl?BaseSixtyFour (滚动代码样本通过MiloBird用户)。现在我可以构造图像成功。

它利用目标-c类别添加选择 + (id)dataWithBase64EncodedString:(NSString *)string; 到NSData类。这是必要的代码样本我从中提取的以上的链接:

//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

谢谢你!

其他提示

的伎俩 NSString 是,有一个隐含的编码与其包含的数据。图像的接收,但是,可能在一个格式,将不正确转换,因为它是二进制数据或一些无损的编码的二进制数据(例如,base64)。的伎俩,然后,是要确保你不让 NSString 执行任何编码转换,否则你的图像数据将被破坏。而不是使用 dataUsingEncoding: 我会尝试API更多的喜欢 getBytes:maxLength:usedLength:encoding:options:range:remainingRange.同时要复杂得多 dataUsingEncoding: 我觉得它会给你所需的灵活性,以获得 仅有的数据 从NSString并没有什么更多。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top