zoukankan      html  css  js  c++  java
  • 纯C:url base64

    纯代码,来自互联网

    base64.h

    #ifndef __BASE64_H__
    #define __BASE64_H__
    
    #ifdef __cplusplus
    extern "C" {
    #endif
    char * base64_encode(const unsigned char * bindata, char * base64, int binlength);
    int base64_decode(const char * base64, unsigned char * bindata);
    
    char *Base64Encode(unsigned char *in, int inLen);
    unsigned char *Base64Decode(char *in, int *outLen);
    
    #ifdef __cplusplus
    }
    #endif
    
    #endif
    

    base64.c

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    //const char * base64char = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    const char * base64char = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
    
    char * base64_encode(const unsigned char * bindata, char * base64, int binlength)
    {
        int i, j;
        unsigned char current;
    
        for (i = 0, j = 0; i < binlength; i += 3)
        {
            current = (bindata[i] >> 2);
            current &= (unsigned char)0x3F;
            base64[j++] = base64char[(int)current];
    
            current = ((unsigned char)(bindata[i] << 4)) & ((unsigned char)0x30);
            if (i + 1 >= binlength)
            {
                base64[j++] = base64char[(int)current];
                base64[j++] = '=';
                base64[j++] = '=';
                break;
            }
            current |= ((unsigned char)(bindata[i + 1] >> 4)) & ((unsigned char)0x0F);
            base64[j++] = base64char[(int)current];
    
            current = ((unsigned char)(bindata[i + 1] << 2)) & ((unsigned char)0x3C);
            if (i + 2 >= binlength)
            {
                base64[j++] = base64char[(int)current];
                base64[j++] = '=';
                break;
            }
            current |= ((unsigned char)(bindata[i + 2] >> 6)) & ((unsigned char)0x03);
            base64[j++] = base64char[(int)current];
    
            current = ((unsigned char)bindata[i + 2]) & ((unsigned char)0x3F);
            base64[j++] = base64char[(int)current];
        }
        base64[j] = '';
        return base64;
    }
    
    int base64_decode(const char * base64, unsigned char * bindata)
    {
        int i, j;
        unsigned char k;
        unsigned char temp[4];
        for (i = 0, j = 0; base64[i] != ''; i += 4)
        {
            memset(temp, 0xFF, sizeof(temp));
            for (k = 0; k < 64; k++)
            {
                if (base64char[k] == base64[i])
                    temp[0] = k;
            }
            for (k = 0; k < 64; k++)
            {
                if (base64char[k] == base64[i + 1])
                    temp[1] = k;
            }
            for (k = 0; k < 64; k++)
            {
                if (base64char[k] == base64[i + 2])
                    temp[2] = k;
            }
            for (k = 0; k < 64; k++)
            {
                if (base64char[k] == base64[i + 3])
                    temp[3] = k;
            }
    
            bindata[j++] = ((unsigned char)(((unsigned char)(temp[0] << 2)) & 0xFC)) |
                ((unsigned char)((unsigned char)(temp[1] >> 4) & 0x03));
            if (base64[i + 2] == '=')
                break;
    
            bindata[j++] = ((unsigned char)(((unsigned char)(temp[1] << 4)) & 0xF0)) |
                ((unsigned char)((unsigned char)(temp[2] >> 2) & 0x0F));
            if (base64[i + 3] == '=')
                break;
    
            bindata[j++] = ((unsigned char)(((unsigned char)(temp[2] << 6)) & 0xF0)) |
                ((unsigned char)(temp[3] & 0x3F));
        }
        return j;
    }
    //URL BASE 64
    char *Base64Encode(unsigned char *in, int inLen)
    {
        int blen = (inLen / 3 + 1) * 4 + 1;
        char *out = (char *)malloc(blen);
        memset(out, 0x00, blen);
        base64_encode((unsigned char *)in, out, inLen);
        return out;
    }
    
    unsigned char *Base64Decode(char *in,int *outLen)
    {
        int xLen = 0;
        int inLen = strlen(in);
        if (inLen == 0){ return NULL; }
        if (in[inLen - 1] != '='){
            xLen = inLen / 4 * 3;
        }else{
            xLen = inLen * 6 / 8;
        }
        unsigned char *out = (unsigned char *)malloc(xLen+1);
        memset(out, 0x00, xLen+1);
        int len = base64_decode(in, out);
        *outLen = len;
        return out;
    }
    
  • 相关阅读:
    SQL Server 优化-执行计划
    SQL Server 开发-语法学习
    MySQL管理_数据库常用命令
    MySQL管理_数据库启动与关闭
    SQL Server DBA日常查询视图_数据库性能视图
    SQL Server DBA性能优化
    MySQL系列 | MySQL高级-08逻辑架构
    工具系列 | Docker基本概念
    PHP系列 | [转] PHP中被忽略的性能优化利器:生成器
    PHP系列 | 代码复用trait的构造函数使用
  • 原文地址:https://www.cnblogs.com/cqvoip/p/8078734.html
Copyright © 2011-2022 走看看