如何解码/转换base64字符串到NSData?

时间:2012-08-18 16:36:24

标签: ios xcode nsstring base64

您好我想弄清楚如何将iOS应用程序中的base64字符串转换/解码为NSData,这样我就可以解密我加密的数据。

我可以找到用于将NSData转换为base 64字符串的方法here是否有类似的方法来创建解码/转换base 64字符串为NSData的方法?

1 个答案:

答案 0 :(得分:14)

这就是我想要的。

+ (NSData *)base64DataFromString: (NSString *)string
{
unsigned long ixtext, lentext;
unsigned char ch, inbuf[4], outbuf[3];
short i, ixinbuf;
Boolean flignore, flendtext = false;
const unsigned char *tempcstring;
NSMutableData *theData;

if (string == nil)
{
    return [NSData data];
}

ixtext = 0;

tempcstring = (const unsigned char *)[string UTF8String];

lentext = [string length];

theData = [NSMutableData dataWithCapacity: lentext];

ixinbuf = 0;

while (true)
{
    if (ixtext >= lentext)
    {
        break;
    }

    ch = tempcstring [ixtext++];

    flignore = false;

    if ((ch >= 'A') && (ch <= 'Z'))
    {
        ch = ch - 'A';
    }
    else if ((ch >= 'a') && (ch <= 'z'))
    {
        ch = ch - 'a' + 26;
    }
    else if ((ch >= '0') && (ch <= '9'))
    {
        ch = ch - '0' + 52;
    }
    else if (ch == '+')
    {
        ch = 62;
    }
    else if (ch == '=')
    {
        flendtext = true;
    }
    else if (ch == '/')
    {
        ch = 63;
    }
    else
    {
        flignore = true; 
    }

    if (!flignore)
    {
        short ctcharsinbuf = 3;
        Boolean flbreak = false;

        if (flendtext)
        {
            if (ixinbuf == 0)
            {
                break;
            }

            if ((ixinbuf == 1) || (ixinbuf == 2))
            {
                ctcharsinbuf = 1;
            }
            else
            {
                ctcharsinbuf = 2;
            }

            ixinbuf = 3;

            flbreak = true;
        }

        inbuf [ixinbuf++] = ch;

        if (ixinbuf == 4)
        {
            ixinbuf = 0;

            outbuf[0] = (inbuf[0] << 2) | ((inbuf[1] & 0x30) >> 4);
            outbuf[1] = ((inbuf[1] & 0x0F) << 4) | ((inbuf[2] & 0x3C) >> 2);
            outbuf[2] = ((inbuf[2] & 0x03) << 6) | (inbuf[3] & 0x3F);

            for (i = 0; i < ctcharsinbuf; i++)
            {
                [theData appendBytes: &outbuf[i] length: 1];
            }
        }

        if (flbreak)
        {
            break;
        }
    }
}

return theData;
}