精华内容
下载资源
问答
  • jni调用c编码解码base64

    千次阅读 2012-12-23 23:56:04
    最近看了下怎么编码解码base64,就顺便使用jni调用方法,编译成dll,给java使用。 这个base64没有按照base64标准,和apache的包一样没有进行76字符加换行符。 #include #include #include #include "Base64Code...

    最近看了下怎么编码解码base64,就顺便使用jni调用方法,编译成dll,给java使用。

    这个base64没有按照base64标准,和apache的包一样没有进行76字符加换行符。

    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include "Base64Code.h"
    /*code解码表*/
    static char Base64Code[] = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T',
    				'U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i','j','k','l','m','n',
    				'o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7',
    				'8','9','+','/','=','\0'};
    
    /*编码*/
    char* encode(char *buf,int length)
    {
        char* enbuf,*p;
        p=enbuf=malloc((length%3==0?length/3*4:(length/3+1)*4)*sizeof(char));
        int i;
        char b1,b2,b3,temp;/*辅助变量*/
        /*3字节一次进行解码,没有满足3字节用0补充*/
        for (i=0;i<length;i=i+3){
            b1=buf[i];
            *(p++)=Base64Code[((b1>>2)&0x3f)];
            b2=(i+1)>=length?0:buf[i+1];
            *(p++)=Base64Code[(((b1<<4)&0x3f)+((b2>>4)&0xf))];
            b3=(i+2)>=length?0:buf[i+2];
            /*补充的用code码表中的64位代替,就是=*/
            temp=b2==0?64:(((b2<<2)&0x3f)+((b3>>6)&0x3));
            *(p++)=Base64Code[temp];
            *(p++)=Base64Code[b3==0?64:(b3&0x3f)];
        }
        *(p)='\0';/*字符串结尾*/
        return enbuf;
    }
    /*取码表索引*/
    char getIndex(char c,char* buf)
    {
        int i;
        for (i=0;i<strlen(buf);++i){
            if (c==buf[i]){return i;}
        }
        return 0;
    }
    /*解码*/
    char* decode(char* buf,int length)
    {
        char b1,b2,b3,b4;
        int i;
        char* debuf,*p;
        p=debuf=malloc((length/4*3)*sizeof(char));
        /*4字节进行解码*/
        for (i=0;i<length;i=i+4){
            b1=getIndex(buf[i],Base64Code);
            b2=getIndex(buf[i+1],Base64Code);
            b3=getIndex(buf[i+2],Base64Code);
            b4=getIndex(buf[i+3],Base64Code);
            *(p++)=((b1<<2)+((b2>>4)&0x3));
            /*64对应=号,表示原字节空*/
            if (b3!=64){
                *(p++)=((b2&0x0f)<<4)+((b3>>2)&0xf);
                if (b4!=64){
                    *(p++)=((b3<<6)+b4);
                }
            }
        }
        *(p)='\0';
        return debuf;
    }
    /*对应java中edBase方法*/
    JNIEXPORT jbyteArray JNICALL Java_Base64Code_enBase(JNIEnv *env, jobject obj, jbyteArray array)
    {
        jbyte * buf;
        /*获取字节数组*/
        buf=(*env)->GetByteArrayElements(env,array,NULL);
        /*GetArrayLength 取数组长度*/
        char* enbuf=encode((char*)buf,(*env)->GetArrayLength(env,array));
        printf("%s\n",enbuf);
        /*new一个字节数组*/
        jbyteArray enarray=(*env)->NewByteArray(env,strlen(enbuf));
        (*env)->SetByteArrayRegion(env,enarray,0,strlen(enbuf),(jbyte*)enbuf);
        return enarray;
    }
    /*对应java中deBase方法*/
    JNIEXPORT jbyteArray JNICALL Java_Base64Code_deBase(JNIEnv *env, jobject obj, jbyteArray array)
    {
        jbyte * buf;
        buf=(*env)->GetByteArrayElements(env,array,NULL);
        /*解码*/
        char* debuf=decode((char*)buf,(*env)->GetArrayLength(env,array));
        jbyteArray dearray=(*env)->NewByteArray(env,strlen(debuf));
        (*env)->SetByteArrayRegion(env,dearray,0,strlen(debuf),(jbyte*)debuf);
        return dearray;
    }
    



    jni生成的头文件

    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include "jni.h"
    /* Header for class Base64Code */
    
    #ifndef _Included_Base64Code
    #define _Included_Base64Code
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     Base64Code
     * Method:    enBase
     * Signature: ([B)[B
     */
    JNIEXPORT jbyteArray JNICALL Java_Base64Code_enBase
      (JNIEnv *, jobject, jbyteArray);
    
    /*
     * Class:     Base64Code
     * Method:    deBase
     * Signature: ([B)[B
     */
    JNIEXPORT jbyteArray JNICALL Java_Base64Code_deBase
      (JNIEnv *, jobject, jbyteArray);
    
    #ifdef __cplusplus
    }
    #endif
    #endif
    

    java中调用代码。

    import java.io.UnsupportedEncodingException;
    public class Base64Code {
    	static{
    		System.loadLibrary("JniDemo");
    	}
    	public native byte[] enBase(byte[] buf);
    	public native byte[] deBase(byte[] buf);
    	public static void main(String[] args) throws UnsupportedEncodingException {
    		Base64Code base=new Base64Code();
    		byte[] b=base.enBase("不是吧iek34d".getBytes("utf-8"));//编码,编码格式自定义,dll只负责base64编码解码
    		System.out.println(new String(b,"utf-8"));
    		//byte[] buf=base.deBase("aWU0OWlma2Y=".getBytes("utf-8"));//解码,解码格式和编码相对应
    		//System.out.println(new String(buf,"utf-8"));
    	}
    }
    



    展开全文
  • Base64 base = new Base64(); String imageData2 = request.getParameter("imageData2"); System.out.print("*******************"+imageData2); String filePath="D:\\"; String fileName="bird.png"; ...
  • 是这样的。服务器获得一个图片jpg字节数组,已经编码成base64了。...现在 js前端怎么解码这个base64字符串,变成 byte字节数组,然后把jpg显示在 网页上呀? 多谢了。 已经弄了大半天了,没有结果。
  • Base64中进行编码和解码的简单库。 怎么测试呢? 该库带有示例代码,因此可以毫无问题地对其进行测试。 g++ main.cpp base64.cpp -o Base64 ./Base64 如何将其包含在我们的项目中? 您必须将提供的文件base64....
  • base64,fDEwMDoxNjcuMSxELFBlbmNpbCwzLCMwMDB8MTAwOjE2Ny4xLFV8MTAwOjE2Ny4xLER8MTAyOjE2My4xLE18MTM1OjEyNS4xfDIwNjo5Ny4xfDI4OTo5OS4xfDMyMzoxMzQuMXwzMTY6MjUyLjF8MjA1OjMzMS4xfDIzNDoyNjAuMXw1MDQ6MTAyLjF8...
  • base64 编码长度是 ceil(n/3) * 4 n是原始数据长度 base64 解码长度怎么算?
  • 最近这段时间在跟前端同学联调的时候有个小需求, 需要把某些图片类型的标签换成base64编码, 直接放入到img的src里,因此找了一个工具, 顺便理解了一下base64的算法, 特此... base64解密 base64解码 图片转base64 b...

    最近这段时间在跟前端同学联调的时候有个小需求, 需要把某些图片类型的标签换成base64编码, 直接放入到img的src里,因此找了一个工具, 顺便理解了一下base64的算法, 特此记录一下

    如何图片转base64字符串

    这个可以自己用代码批量实现,  不过我给产品同学推荐的是   http://base64.pro/  提供了主要提供了四种功能(这个站也提供了base64在各个编程语言种的实现)

    • base64编码 base64加密
    • base64解密  base64解码
    • 图片转base64
    • base64转图片

    效果大概如下

     

    一句话了解Base64加密算法

    a-zA-Z1-9等字符构造一个索引表, 一共是64个, 那么64是多少Bit呢?  显然是6个bit,  而一个byte是8个bit, 只需要讲字节流从前往后每隔6个每隔6个的计算, 

    如果还有空缺, 直接补齐即可。所以所有的文件只要能读成字节流总能转换成base64的, 这就是为什么图片也能变base64的原因, 一般来说base64算法可以根据

    自定义的索引表来搞, 这个是大家共同的算法, 也可以自己设计一个码表, 基础码表见 http://base64.pro/  文章末尾

    展开全文
  • C语言实现base64解码

    2019-09-14 20:37:04
    工作中经常会用到base64解码, 有些开源库中也有实现, 但是如果再去看他们的怎么用有时候也是有点费劲的, 还有就是需要引用那个头文件啊, 什么的, 尤其是OpenSSL里边的, 所以这里献上原理, 及其使用. 至于用途.....

    base64编解码

    • 工作中经常会用到base64编解码, 有些开源库中也有实现, 但是如果再去看他们的怎么用有时候也是有点费劲的, 还有就是需要引用那个头文件啊, 什么的, 尤其是OpenSSL里边的, 所以这里献上原理, 及其使用.

    • 至于用途还有详细的介绍我觉得某度某科里讲的挺好的, 这里就只写上实现原理及代码了.

    • 详细请看base64.h 和base64.c, 使用见main.c 即可, 可以使用任何编译器编译运行, 下面依次是base64.h, base64.c, main.c如果需要源文件可以留言哦, 对你有帮助的话赞一吧, 之后也会把之前的干货, 竟然分享给大家的.请多多支持.

    • 这里我尽量使用了简单的代码结构实现的, 容易理解一点, 如果你理解之后可以加之优化的. 大神请飘过...

    //
    //  base64.h
    //  base64
    //
    //  Created by guofu on 2017/5/25.
    //  Copyright © 2017年 guofu. All rights reserved.
    //
    
    #ifndef base64_h
    #define base64_h
    
    #include <stdio.h>
    
    #if __cplusplus
    extern "C"{
    #endif
        
        int base64_encode(const char *indata, int inlen, char *outdata, int *outlen);
        int base64_decode(const char *indata, int inlen, char *outdata, int *outlen);
                
    #if __cplusplus
    }
    #endif
    
    #endif /* base64_h */
    
    //
    //  base64.c
    //  base64
    //
    //  Created by guofu on 2017/5/25.
    //  Copyright © 2017年 guofu. All rights reserved.
    //
    /**
     *  转解码过程
     *  3 * 8 = 4 * 6; 3字节占24位, 4*6=24
     *  先将要编码的转成对应的ASCII值
     *  如编码: s 1 3
     *  对应ASCII值为: 115 49 51
     *  对应二进制为: 01110011 00110001 00110011
     *  将其6个分组分4组: 011100 110011 000100 110011
     *  而计算机是以8bit存储, 所以在每组的高位补两个0如下:
     *  00011100 00110011 00000100 00110011对应:28 51 4 51
     *  查找base64 转换表 对应 c z E z
     *  
     *  解码
     *  c z E z
     *  对应ASCII值为 99 122 69 122
     *  对应表base64_suffix_map的值为 28 51 4 51
     *  对应二进制值为 00011100 00110011 00000100 00110011
     *  依次去除每组的前两位, 再拼接成3字节
     *  即: 01110011 00110001 00110011
     *  对应的就是s 1 3
     */
    
    #include "base64.h"
    
    #include <stdio.h>
    #include <stdlib.h>
    
    // base64 转换表, 共64个
    static const char base64_alphabet[] = {
        'A', 'B', 'C', 'D', 'E', 'F', 'G',
        'H', 'I', 'J', 'K', 'L', 'M', 'N',
        'O', 'P', 'Q', 'R', 'S', 'T',
        'U', 'V', 'W', 'X', 'Y', 'Z',
        'a', 'b', 'c', 'd', 'e', 'f', 'g',
        'h', 'i', 'j', 'k', 'l', 'm', 'n',
        'o', 'p', 'q', 'r', 's', 't',
        'u', 'v', 'w', 'x', 'y', 'z',
        '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
        '+', '/'};
    
    // 解码时使用
    static const unsigned char base64_suffix_map[256] = {
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 253, 255,
        255, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
        255, 255, 255, 255, 255, 255, 255, 255, 253, 255, 255, 255,
        255, 255, 255, 255, 255, 255, 255,  62, 255, 255, 255,  63,
        52,  53,  54,  55,  56,  57,  58,  59,  60,  61, 255, 255,
        255, 254, 255, 255, 255,   0,   1,   2,   3,   4,   5,   6,
        7,   8,   9,  10,  11,  12,  13,  14,  15,  16,  17,  18,
        19,  20,  21,  22,  23,  24,  25, 255, 255, 255, 255, 255,
        255,  26,  27,  28,  29,  30,  31,  32,  33,  34,  35,  36,
        37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,  48,
        49,  50,  51, 255, 255, 255, 255, 255, 255, 255, 255, 255,
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
        255, 255, 255, 255 };
    
    static char cmove_bits(unsigned char src, unsigned lnum, unsigned rnum) {
        src <<= lnum; // src = src << lnum;
        src >>= rnum; // src = src >> rnum;
        return src;
    }
    
    int base64_encode(const char *indata, int inlen, char *outdata, int *outlen) {
        
        int ret = 0; // return value
        if (indata == NULL || inlen == 0) {
            return ret = -1;
        }
        
        int in_len = 0; // 源字符串长度, 如果in_len不是3的倍数, 那么需要补成3的倍数
        int pad_num = 0; // 需要补齐的字符个数, 这样只有2, 1, 0(0的话不需要拼接, )
        if (inlen % 3 != 0) {
            pad_num = 3 - inlen % 3;
        }
        in_len = inlen + pad_num; // 拼接后的长度, 实际编码需要的长度(3的倍数)
        
        int out_len = in_len * 8 / 6; // 编码后的长度
        
        char *p = outdata; // 定义指针指向传出data的首地址
        
        //编码, 长度为调整后的长度, 3字节一组
        for (int i = 0; i < in_len; i+=3) {
            int value = *indata >> 2; // 将indata第一个字符向右移动2bit(丢弃2bit)
            char c = base64_alphabet[value]; // 对应base64转换表的字符
            *p = c; // 将对应字符(编码后字符)赋值给outdata第一字节
            
            //处理最后一组(最后3字节)的数据
            if (i == inlen + pad_num - 3 && pad_num != 0) {
                if(pad_num == 1) {
                    *(p + 1) = base64_alphabet[(int)(cmove_bits(*indata, 6, 2) + cmove_bits(*(indata + 1), 0, 4))];
                    *(p + 2) = base64_alphabet[(int)cmove_bits(*(indata + 1), 4, 2)];
                    *(p + 3) = '=';
                } else if (pad_num == 2) { // 编码后的数据要补两个 '='
                    *(p + 1) = base64_alphabet[(int)cmove_bits(*indata, 6, 2)];
                    *(p + 2) = '=';
                    *(p + 3) = '=';
                }
            } else { // 处理正常的3字节的数据
                *(p + 1) = base64_alphabet[cmove_bits(*indata, 6, 2) + cmove_bits(*(indata + 1), 0, 4)];
                *(p + 2) = base64_alphabet[cmove_bits(*(indata + 1), 4, 2) + cmove_bits(*(indata + 2), 0, 6)];
                *(p + 3) = base64_alphabet[*(indata + 2) & 0x3f];
            }
            
            p += 4;
            indata += 3;
        }
        
        if(outlen != NULL) {
            *outlen = out_len;
        }
        
        return ret;
    }
    
    
    int base64_decode(const char *indata, int inlen, char *outdata, int *outlen) {
        
        int ret = 0;
        if (indata == NULL || inlen <= 0 || outdata == NULL || outlen == NULL) {
            return ret = -1;
        }
        if (inlen % 4 != 0) { // 需要解码的数据不是4字节倍数
            return ret = -2;
        }
        
        int t = 0, x = 0, y = 0, i = 0;
        unsigned char c = 0;
        int g = 3;
        
        while (indata[x] != 0) {
            // 需要解码的数据对应的ASCII值对应base64_suffix_map的值
            c = base64_suffix_map[indata[x++]];
            if (c == 255) return -1;// 对应的值不在转码表中
            if (c == 253) continue;// 对应的值是换行或者回车
            if (c == 254) { c = 0; g--; }// 对应的值是'='
            t = (t<<6) | c; // 将其依次放入一个int型中占3字节
            if (++y == 4) {
                outdata[i++] = (unsigned char)((t>>16)&0xff);
                if (g > 1) outdata[i++] = (unsigned char)((t>>8)&0xff);
                if (g > 2) outdata[i++] = (unsigned char)(t&0xff);
                y = t = 0;
            }
        }
        if (outlen != NULL) {
            *outlen = i;
        }
        return ret;
    }
    
    //
    //  main.c
    //  base64
    //
    //  Created by guofu on 2017/5/25.
    //  Copyright © 2017年 guofu. All rights reserved.
    //
    
    #include <stdio.h>
    #include <string.h>
    
    #include "base64.h"
    
    int main(int argc, const char * argv[]) {
        // insert code here...
        
        char str1[] = "abcdefg";
        char str2[20] = {0}; //注意长度要给够
        int len = 0;
        base64_encode(str1,(int)strlen(str1),str2,&len);
        printf("%s, len = %d\n", str2, len);
    
        
        char str3[10] = {0};
        base64_decode(str2, (int)strlen(str2), str3, &len);
        
        printf("%s, len = %d\n", str3, len);
        
        
        return 0;
    }


     

    转载于:https://my.oschina.net/u/1777508/blog/3060592

    展开全文
  • base64编码解码

    2011-12-29 12:54:06
    首先要明白Base64编码是怎么一回事,不懂的先去百度一下再回来。 Base64编码是一种加密算法,Email的原始信息就是由Base64编码构成的。 而这些专用链接都是通过Base64编码加工转换而成的。 迅雷专用地址例子:...
    对于迅雷专用链接不用我去解释相信大家都明白(别告诉我你不懂~汗),现在就链接的编码原理及转换详细说明一下,明白以后就可以用迅雷下载快车、旋风专用地址的软件啦。
    首先要明白Base64编码是怎么一回事,不懂的先去百度一下再回来。
    Base64编码是一种加密算法,Email的原始信息就是由Base64编码构成的。
    而这些专用链接都是通过Base64编码加工转换而成的。
    迅雷专用地址例子:thunder://QUFodHRwOi8vZG93bi5pcHZ2LmNuL3diLmV4ZVpa
    真实文件下载链接: http://down.ipvv.cn/wb.exe
     
    搞懂了Base64编码之后,一切都变的得心应手了:
    实例原始地址: http://im.baidu.com/install/BaiduHi.exe
    1、迅雷专用链接编码
    在原地址前面加"AA",后面加"ZZ"(不包括引号),地址变为
    AA http://im.baidu.com/install/BaiduHi.exeZZ
    此地址base64编码为
    QUFodHRwOi8vaW0uYmFpZHUuY29tL2luc3RhbGwvQmFpZHVIaS5leGVaWg==
    迅雷专链即在上地址前加thunder://,即
    Thunder://QUFodHRwOi8vaW0uYmFpZHUuY29tL2luc3RhbGwvQmFpZHVIaS5leGVaWg==
    2、快车专用链接编码
    在原地址前后都加上"[FLASHGET]"(不包括引号),地址变为
    [FLASHGET] http://im.baidu.com/install/BaiduHi.exe[FLASHGET]
    此地址base64编码为
    W0ZMQVNIR0VUXWh0dHA6Ly9pbS5iYWlkdS5jb20vaW5zdGFsbC9CYWlkdUhpLmV4ZVtGTEFTSEdFVF0=&yinbing1986
    快车专链即在上地址前加flashget://,注意后面还要加上"&符号",符号怎么得出不清楚,在最后后面加的是好好爱的个人信息,至今未有人报告转换错误,即
    Flashget://W0ZMQVNIR0VUXWh0dHA6Ly9pbS5iYWlkdS5jb20vaW5zdGFsbC9CYWlkdUhpLmV4ZVtGTEFTSEdFVF0=&yinbing1986
    3、旋风专用链接编码
    旋风相对就简单多了,将原地址直接base64编码为
    aHR0cDovL2ltLmJhaWR1LmNvbS9pbnN0YWxsL0JhaWR1SGkuZXhl
    旋风专链即在上地址前加qqdl://,即

    qqdl://aHR0cDovL2ltLmJhaWR1LmNvbS9pbnN0YWxsL0JhaWR1SGkuZXhl


    相关的源代码:

    /* *****************************************************************************
    
     * Description : BASE64 encoding and decoding
    
     * Date             : 06-08-21 21:00
    
     * Author          :  aishen944
    
     * Copryright   : 
    
    ********************************************************************************/
    
    #include <string.h>
    #include <stdlib.h>
    #include <errno.h>
    
    #define BASE64_PAD64 '='
    
    char base64_alphabet[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I',
                              'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R',
                              'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a',
                              'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
                              'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's',
                              't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1',
                              '2', '3', '4', '5', '6', '7', '8', '9', '+',
                              '/'};
    
    char base64_suffix_map[256] = {
         255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
         255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
         255, 255, 255,  62, 255, 255, 255,  63,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61, 255, 255,
         255, 255, 255, 255, 255,  0,   1,    2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,
         15,   16,  17,  18,  19,  20,  21,  22,  23,  24,  25, 255, 255, 255, 255, 255, 255,  26,  27,  28,
         29,   30,  31,  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,  48,
         49,   50,  51, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
         255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
         255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
         255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
         255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
         255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
         255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255};
    
    static char cmove_bits(unsigned char src, unsigned lnum, unsigned rnum) {
       src <<= lnum;
       src >>= rnum;
       return src;
    }
    
    char* base64_encode(const char *data) {
       char *ret, *retpos;
       int n, m, padnum = 0, retsize, dlen = strlen(data);
    
       if(dlen == 0) return NULL;
    
       /* Account the result buffer size and alloc the memory for it. */
       if((dlen % 3) != 0)
        padnum = 3 - dlen % 3;
       retsize = (dlen + padnum) + ((dlen + padnum) * 1/3) + 1;
       if((ret = malloc(retsize)) == NULL) 
          return NULL;
       retpos = ret;
    
       /* Starting to convert the originality characters to BASE64 chracaters. 
          Converting process keep to 4->6 principle. */
       for(m = 0; m < (dlen + padnum); m += 3) {
          /* When data is not suffice 24 bits then pad 0 and the empty place pad '='. */
          *(retpos) = base64_alphabet[cmove_bits(*data, 0, 2)];
          if(m == dlen + padnum - 3 && padnum != 0) {  /* Whether the last bits-group suffice 24 bits. */
              if(padnum == 1) {   /* 16bit need pad one '='. */
                  *(retpos + 1) = base64_alphabet[cmove_bits(*data, 6, 2) + cmove_bits(*(data + 1), 0, 4)];
                  *(retpos + 2) = base64_alphabet[cmove_bits(*(data + 1), 4, 2)];
                  *(retpos + 3) = BASE64_PAD64;
              } else if(padnum == 2) { /* 8bit need pad two'='. */
                  *(retpos + 1) = base64_alphabet[cmove_bits(*data, 6, 2)];
                  *(retpos + 2) = BASE64_PAD64;
                  *(retpos + 3) = BASE64_PAD64;
              }
          } else {  /* 24bit normal. */
             *(retpos + 1) = base64_alphabet[cmove_bits(*data, 6, 2) + cmove_bits(*(data + 1), 0, 4)];
             *(retpos + 2) = base64_alphabet[cmove_bits(*(data + 1), 4, 2) + cmove_bits(*(data + 2), 0, 6)];
             *(retpos + 3) = base64_alphabet[*(data + 2) & 0x3f];
          }
    
          retpos += 4;
          data += 3;
       }
    
       ret[retsize - 1] =0;
    
       return ret;
    }
    
    char* base64_decode(const char *bdata) {
       char *ret = NULL, *retpos;
       int n, m, padnum = 0, retsize, bdlen = strlen(bdata);
    
       if(bdlen == 0) return NULL;
       if(bdlen % 4 != 0) return NULL;
    
       /* Whether the data have invalid base-64 characters? */
       for(m = 0; m < bdlen; ++m) {
          if(bdata[m] != BASE64_PAD64 && base64_suffix_map[bdata[m]] == 255)
             goto LEND;
       }
    
       /* Account the output size. */
       if(bdata[bdlen - 1] ==  '=')  padnum = 1;
       if(bdata[bdlen - 1] == '=' && bdata[bdlen - 2] ==  '=') padnum = 2;
       retsize = (bdlen - 4) - (bdlen - 4) / 4 + (3 - padnum) + 1;
       ret = malloc(retsize);
       if(ret == NULL) 
             return NULL;
       retpos = ret;
    
       /* Begging to decode. */
       for(m = 0; m < bdlen; m += 4) {
          *retpos = cmove_bits(base64_suffix_map[*bdata], 2, 0) + cmove_bits(base64_suffix_map[*(bdata + 1)], 0, 4);
          if(m == bdlen - 4 && padnum != 0) {  /* Only deal with last four bits. */
             if(padnum == 1)   /* Have one pad characters, only two availability characters. */
                *(retpos + 1) = cmove_bits(base64_suffix_map[*(bdata + 1)], 4, 0) + cmove_bits(base64_suffix_map[*(bdata + 2)], 0, 2);
             /*
             Have two pad characters, only two availability characters.
             if(padnum == 2) { 
             }
             */
             retpos += 3 - padnum;
          } else {
             *(retpos + 1) = cmove_bits(base64_suffix_map[*(bdata + 1)], 4, 0) + cmove_bits(base64_suffix_map[*(bdata + 2)], 0, 2);
             *(retpos + 2) = cmove_bits(base64_suffix_map[*(bdata + 2)], 6, 0) + base64_suffix_map[*(bdata + 3)];
             retpos += 3;
          }
          bdata += 4;
       }
    
       ret[retsize - 1] = 0;
    
       LEND: return ret;
    }
    
    int main(){
        char code[1000],*decode;
        printf("编码:");
    	scanf("%s", code);
    	printf("\n");
    	
    	decode = base64_decode(code);
    	printf("原码:%s\n", decode);
    	
    	return 0;
    }


    展开全文
  • Android 中Base64编码解码

    千次阅读 2016-03-22 10:58:28
    首先要说明的是Base64是编码解码,而不是加密解密,因为加密解密你是需要密钥的,编码是大家都知道怎么解码的,不需要密钥的。 Base64,将任意的字节数组,通过算法,生成只有(英文大小写(52个字母),数字(10个...
  • base64编码和解码

    2018-09-29 17:37:00
    一、base64是什么?  由26个大小写英文字母,0~9的10个数字和两个字符(斜杠'/'与加号'+')组成。 正因为它们都是可见的,所以被用来对传递在前端和后台之间的信息(尤其是不可见的)进行编码,比如图片,由ASCII...
  • Base64编码解码算法

    千次阅读 2014-10-28 16:40:16
    Base64不是什么新奇的算法了,不过如果你没从事过页面开发(或者说动态页面开发,尤其是邮箱服务),你都不怎么了解过,只是听起来很熟悉。 对于黑客来说,Base64与MD5算法有着同样的位置,因为电子邮箱(e-mail...
  • base64解码转图片为空

    2015-12-07 07:24:57
    我用cropbox裁剪完图片后得到base64的串 传到后台取解码发现IO写图片的时候报空异常, 请问这个怎么解决 下面放解码的方法 ``` static void base64StringToImage(String base64String){ try { byte[] bytes1 ...
  • 服务器上面的图片转成base64编码以后,然后解码怎么将他存到list里面啊,写到这步不知道怎么写了,![图片说明](http://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/001/face/1.gif)![图片说明]...
  • 在那些解码网站上:http://www1.tc711.com/tool/BASE64.htm是解码出来的,但是在安卓解不出来,不知道为什么?? 求熟悉的帮破一下,这个东西搞了一个多少时....搞不懂,都同样的代码,怎么就不行呢? 提示...
  • Base64编码和解码算法

    2015-09-28 17:42:00
    Base64么新鲜的算法了。只是假设你没从事过页面开发(或者说动态页面开发。尤其是邮箱服务),你都不怎么了解过,仅仅是听起来非常熟悉。 对于黑客来说,Base64与MD5算法有着相同的位置。由于电子邮箱(e-mail)...
  • byte[] asBytes = Base64.getDecoder().decode(str); System.out.println(asBytes.length); StringBuffer result = new StringBuffer(); for (int i = 0; i ; i++) { result.append(Long.toString...
  • 在网上百度了一下例子文章,很少有文章介绍怎么保存、传输、打印加密后的文本信息,都是千篇一律的。直接在一个脚本,加密后的文本信息赋于变量,然后立马调用解密。仔细想了一下RSA加密解密的过程,确定有二端,...
  • aHR0cDovL3YzLXhnLXdlYi1kZWZhdWx0Lml4aWd1YS5jb20vNDY1OTliMDdhYWYwN2U3NTUzNDJiZGIzZWQ1N2ZkN2YvNWY2MWU3ZmUvdmlkZW8vdG9zL2NuL3Rvcy1jbi12ZS02...才能正常访问 请问php文件通过base64_decode解密时候,该如何解决?
  • 本来是要看varint的源码,看到最后几个方法时,用到base64解码,由于之前看过淘宝余庆大神写的在FastDFS中用c实现的base64编解,阅读后叹为观止。 在下是一个好奇的程序员,于是想看一下eos是怎么用c++实现的。...
  • 其实凭经验大多数人第一时间想到的就是这是base64编码,告知后但对方就是没法解,没办法啊,好人做到底,动手给对方写个demo,利用indy自带的TIdEncoderMIME和TIdDecoderMIME来完成该过程。关键代码如下: unit ...
  • 1,我用python的base64解码一个接口的js,得到的中文显示格式是\xe7\xb3\xbb\xe7\xbb\x9f\xe7\xb9\x81\xe5\xbf\x99,\xe8\xaf\xb7\xe7\xa8\x8d\xe5\x90\x8e\xe5\x86\x8d\xe8\xaf\x95 2,如果我用fiddler直接解码,...
  • 比如微信表情[img=https://img-bbs.csdn.net/upload/201712/12/1513066777_750036.png][/img],Base64编码后是 7aC97biE,需要把“7aC97biE”解码为原来的微信表情[img=...[/img]
  • 【功能点】前端vue传过来的是base64格式(解码变成二进制)的图片怎么做多图上传
  • 要求:JDK1.8+ 使用java原生工具类即可实现 ...【这里展示字符串转化为byte[]实现的编码和解码 那文件,例如图片文件是怎么实现编码进行存储的呢? 参考:http://www.cnblogs.com/sxdcgaq8080/p/8404404.html】 ...
  • 签名验证, Wechatpay-Signature的字段值使用Base64进行解码是乱码,怎么处理?我的代码获取的Wechatpay-Signature 值是这样的:B5ij94EE7vCd8v/Aa25uP1O/UHUYUxBRxcW+hNK7fdv7prYYqdQqmzBnDySV/WAB+KBcxy/cugaCTXRCJd...
  • 2、处理字符串,给多余的字符串去掉,因为这些会阻止你base64_decode解码 3、创建路径、图片名称。将base64的图片写入文件 4、取出上传图片的地址。模型入库用 下图107行和上图56行,圈出来的是一个参数,改了...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 134
精华内容 53
关键字:

怎么解码base64