xcode 如何将 base64 字符串解码/转换为 NSData?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/12020307/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-15 01:15:54  来源:igfitidea点击:

How to decode / convert a base64 string to NSData?

iosxcodensstringbase64

提问by ipatch

Hello I am trying to figure out how convert / decode a base64 string in an iOS application to NSData, so I can decrypt the data that I encrypted.

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

The method I used for converting the NSData to a base 64 string can be found hereIs there a similar way to create method to decode / convert the base 64 string to NSData?

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

回答by ipatch

This is what I was looking for.

这就是我一直在寻找的。

+ (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;
}