zoukankan      html  css  js  c++  java
  • base64编解码的另外几个版本

    #include "crypto/encode/base64.h"
    
    static const std::string base64_chars =
        "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        "abcdefghijklmnopqrstuvwxyz"
        "0123456789+/";
    
    static inline bool is_base64(unsigned char c)
    {
        return (isalnum(c) || (c == '+') || (c == '/'));
    }
    
    std::string Base64::Encode(const std::string& src)
    {
        std::string ret;
        unsigned char char_array_3[3];
        unsigned char char_array_4[4];
    
        size_t srcLen = src.length();
        const char* pSrc = src.c_str();
    
        size_t i = 0;
        while (srcLen--) {
            char_array_3[i++] = *(pSrc++);
            if (i == 3) {
                char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
                char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
                char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
                char_array_4[3] = char_array_3[2] & 0x3f;
    
                for (i = 0; (i <4); i++)
                    ret += base64_chars[char_array_4[i]];
                i = 0;
            }
        }
    
        size_t j = 0;
        if (i)
        {
            for (j = i; j < 3; j++)
                char_array_3[j] = '';
    
            char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
            char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
            char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
            char_array_4[3] = char_array_3[2] & 0x3f;
    
            for (j = 0; (j < i + 1); j++)
                ret += base64_chars[char_array_4[j]];
    
            while ((i++ < 3))
                ret += '=';
    
        }
    
        return ret;
    }
    
    std::string Base64::Encode(const unsigned char* src, size_t dataLen)
    {
        if ((src == NULL) || (dataLen == 0))
        {
            return std::string();
        }
    
        std::string ret;
        unsigned char char_array_3[3];
        unsigned char char_array_4[4];
    
        size_t srcLen = dataLen;
        const char* pSrc = reinterpret_cast<const char*>(src);
    
        size_t i = 0;
        while (srcLen--) {
            char_array_3[i++] = *(pSrc++);
            if (i == 3) {
                char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
                char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
                char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
                char_array_4[3] = char_array_3[2] & 0x3f;
    
                for (i = 0; (i <4); i++)
                    ret += base64_chars[char_array_4[i]];
                i = 0;
            }
        }
    
        size_t j = 0;
        if (i)
        {
            for (j = i; j < 3; j++)
                char_array_3[j] = '';
    
            char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
            char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
            char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
            char_array_4[3] = char_array_3[2] & 0x3f;
    
            for (j = 0; (j < i + 1); j++)
                ret += base64_chars[char_array_4[j]];
    
            while ((i++ < 3))
                ret += '=';
        }
    
        return ret;
    }
    
    bool Base64::Decode(const std::string& src, std::string& out)
    {
        out.clear();
    
        size_t in_len = src.size();
        size_t i = 0;
        size_t j = 0;
        size_t in_ = 0;
        unsigned char char_array_4[4], char_array_3[3];
    
        while (in_len-- && (src[in_] != '=') && is_base64(src[in_])) {
            char_array_4[i++] = src[in_]; in_++;
            if (i == 4) {
                for (i = 0; i <4; i++)
                    char_array_4[i] = (unsigned char)base64_chars.find(char_array_4[i]);
    
                char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
                char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
                char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
    
                for (i = 0; (i < 3); i++)
                    out += char_array_3[i];
                i = 0;
            }
        }
    
        if (i) {
            for (j = i; j <4; j++)
                char_array_4[j] = 0;
    
            for (j = 0; j <4; j++)
                char_array_4[j] = (unsigned char)base64_chars.find(char_array_4[j]);
    
            char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
            char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
            char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
    
            for (j = 0; (j < i - 1); j++)
                out += char_array_3[j];
        }
    
        return true;
    }
    
    bool Base64::Decode(const unsigned char* src, size_t srcLen, unsigned char* decoded, size_t& decoded_length)
    {
        if ((src == NULL) || (srcLen < 1))
            return false;
        if ((decoded == NULL) || (decoded_length < 1))
            return false;
    
        size_t i = 0;
        size_t j = 0;
        size_t in_ = 0;
        unsigned char char_array_4[4];
        unsigned char char_array_3[3];
    
        size_t offset = 0;
        while (srcLen-- && (src[in_] != '=') && is_base64(src[in_])) {
            char_array_4[i++] = src[in_]; in_++;
            if (i == 4) {
                for (i = 0; i <4; i++)
                    char_array_4[i] = (unsigned char)base64_chars.find(char_array_4[i]);
    
                char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
                char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
                char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
    
                for (i = 0; i < 3; i++)
                {
                    if (offset < decoded_length)
                        decoded[offset++] = char_array_3[i];
                    else
                        return false;
                }
                i = 0;
            }
        }
    
        if (i) {
            for (j = i; j <4; j++)
                char_array_4[j] = 0;
    
            for (j = 0; j <4; j++)
                char_array_4[j] = (unsigned char)base64_chars.find(char_array_4[j]);
    
            char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
            char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
            char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
    
            for (j = 0; (j < i - 1); j++)
            {
                if (offset < decoded_length)
                    decoded[offset++] = char_array_3[j];
                else
                    return false;
            }
        }
    
        decoded_length = offset;
    
        return true;
    }
    
    bool Base64::Decode(const unsigned char* src, size_t srcLen, std::vector<unsigned char>& out)
    {
        out.clear();
    
        size_t i = 0;
        size_t j = 0;
        size_t in_ = 0;
        unsigned char char_array_4[4];
        unsigned char char_array_3[3];
    
        while (srcLen-- && (src[in_] != '=') && is_base64(src[in_])) {
            char_array_4[i++] = src[in_]; in_++;
            if (i == 4) {
                for (i = 0; i <4; i++)
                    char_array_4[i] = (unsigned char)base64_chars.find(char_array_4[i]);
    
                char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
                char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
                char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
    
                for (i = 0; (i < 3); i++)
                    out.push_back(char_array_3[i]);
                i = 0;
            }
        }
    
        if (i) {
            for (j = i; j <4; j++)
                char_array_4[j] = 0;
    
            for (j = 0; j <4; j++)
                char_array_4[j] = (unsigned char)base64_chars.find(char_array_4[j]);
    
            char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
            char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
            char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
    
            for (j = 0; (j < i - 1); j++)
                out.push_back(char_array_3[j]);
        }
    
        return true;
    }
  • 相关阅读:
    Beyond Compare 4破解有效方案
    C#调用API实现程序间相互控制(附源码)
    IOS7使用吐槽(抛弃拟物化您还能走多远.........)
    随话web编程与淘宝
    错误应用程序 iexplore.exe,版本 6.0.2900.2180,错误模块 mshtml.dll
    SQL基础语句总结
    Windows Image Acquisition (WIA) 服务在启动时暂停
    点击按钮后变灰提交页面
    我看IE与FFJs读取xml文件
    ABAPALV(3)
  • 原文地址:https://www.cnblogs.com/eaglexmw/p/11130442.html
Copyright © 2011-2022 走看看