Java实现Base64互相编解码转换图片与字符串

Base64基本算法原理

字符串实例(对s13进行Base64编解码)
测试:s13
编码:czEz
解码:s13

如何编码s13为czEz的过程分析:

Base64要求把每三个8Bit的字节转换为四个6Bit的字节(3*8 = 4*6 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。
s13二进制之间的3*8到4*6的过程
115 49 51
01110011 00110001 00110011(asc转到二进制)
011100 110011 000100 110011(分为4组)
00011100 00110011 00000100 00110011(补全8位一组)
28 51 4 51(得到编码后的asc)
czEz(对应的字符串)
———百度百科

这里介绍三种方法:
1 使用commons-codec.jar包
下载地址http://commons.apache.org/proper/commons-codec/download_codec.cgi
Commons项目中用来处理常用的编码方法的工具类包,例如DES、SHA1、MD5、Base64,URL,Soundx等
不仅是编码,也可用于解码。
2 使用sun.misc.BASE64Encoder
JDK中包含了BASE64Encoder,可以直接使用,但是因为它不属于JDK的标准库范畴,所以eclipse无法直接找到,需要进行相关的配置;
3 直接编写base64的转换逻辑
使用base64进行对字节的转换

commons-codec.jar进行base64转换

// 需要下载应用commons-codec.jar包
package commonscodec.demo.base64;

import java.io.UnsupportedEncodingException;
import org.apache.commons.codec.binary.Base64;

public class Main {
    public static void main(String[] args) {

        String str = "s13";
        Base64 base64 = new Base64();
        try {
            str = base64.encodeToString(str.getBytes("UTF-8"));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        System.out.println("Base64 编码后:" + str);
    }
}

sun.misc.BASE64Encoder进行base64转换

// 如果找不到sun.misc.BASE64Decoder包,需要进行相关的配置
package sunmisc.demo.base64;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
///
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public class Main {
    public static void main(String[] args) {
        String strImg = GetImageStr();
        System.out.println(strImg);
        GenerateImage(strImg);
    }

    // 图片转化成base64字符串
    public static String GetImageStr() {
        // 将图片文件转化为字节数组字符串,并对其进行Base64编码处理
        String imgFile = "d://test.png";
        InputStream in = null;
        byte[] data = null;
        // 读取图片字节数组
        try {
            in = new FileInputStream(imgFile);
            data = new byte[in.available()];
            in.read(data);
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 对字节数组Base64编码
        BASE64Encoder encoder = new BASE64Encoder();
        // 返回Base64编码过的字节数组字符串
        return encoder.encode(data);
    }

    // base64字符串转化成图片
    public static boolean GenerateImage(String imgStr) {
        // 对字节数组字符串进行Base64解码并生成图片
        if (imgStr == null)
            return false;
        BASE64Decoder decoder = new BASE64Decoder();
        try {
            // Base64解码
            byte[] b = decoder.decodeBuffer(imgStr);
            for (int i = 0; i < b.length; ++i) {
                if (b[i] < 0) {// 调整异常数据
                    b[i] += 256;
                }
            }
            // 生成新的图片
            String imgFilePath = "d://222.png";
            OutputStream out = new FileOutputStream(imgFilePath);
            out.write(b);
            out.flush();
            out.close();
            return true;
        } catch (Exception e) {
            return false;
        }
    }
}

如果找不到sun.misc.BASE64Decoder包,需要进行相关的配置如下
右键项目-》属性-》Java bulid path-》jre System Library-》access rules-》resolution选择accessible填上** ,点击确定完成配置
这里写图片描述

直接编写逻辑进行base64转换

//来自http://blog.csdn.net/lastsweetop/article/details/5314640
package com.test.base64;

public class Main {
    /**
     * 将原始数据编码为base64编码
     */
    static public char[] encode(byte[] data) {
        char[] out = new char[((data.length + 2) / 3) * 4];
        for (int i = 0, index = 0; i < data.length; i += 3, index += 4) {
            boolean quad = false;
            boolean trip = false;
            int val = (0xFF & (int) data[i]);
            val <<= 8;
            if ((i + 1) < data.length) {
                val |= (0xFF & (int) data[i + 1]);
                trip = true;
            }
            val <<= 8;
            if ((i + 2) < data.length) {
                val |= (0xFF & (int) data[i + 2]);
                quad = true;
            }
            out[index + 3] = alphabet[(quad ? (val & 0x3F) : 64)];
            val >>= 6;
            out[index + 2] = alphabet[(trip ? (val & 0x3F) : 64)];
            val >>= 6;
            out[index + 1] = alphabet[val & 0x3F];
            val >>= 6;
            out[index + 0] = alphabet[val & 0x3F];
        }
        return out;
    }

    /**
     * 将base64编码的数据解码成原始数据
     */
    static public byte[] decode(char[] data) {
        int len = ((data.length + 3) / 4) * 3;
        if (data.length > 0 && data[data.length - 1] == '=')
            --len;
        if (data.length > 1 && data[data.length - 2] == '=')
            --len;
        byte[] out = new byte[len];
        int shift = 0;
        int accum = 0;
        int index = 0;
        for (int ix = 0; ix < data.length; ix++) {
            int value = codes[data[ix] & 0xFF];
            if (value >= 0) {
                accum <<= 6;
                shift += 6;
                accum |= value;
                if (shift >= 8) {
                    shift -= 8;
                    out[index++] = (byte) ((accum >> shift) & 0xff);
                }
            }
        }
        if (index != out.length)
            throw new Error("miscalculated data length!");
        return out;
    }

    static private char[] alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
            .toCharArray();
    static private byte[] codes = new byte[256];
    static {
        for (int i = 0; i < 256; i++)
            codes[i] = -1;
        for (int i = 'A'; i <= 'Z'; i++)
            codes[i] = (byte) (i - 'A');
        for (int i = 'a'; i <= 'z'; i++)
            codes[i] = (byte) (26 + i - 'a');
        for (int i = '0'; i <= '9'; i++)
            codes[i] = (byte) (52 + i - '0');
        codes['+'] = 62;
        codes['/'] = 63;
    }

    public static void main(String[] args) throws Exception {
        // 加密成base64
        String strSrc = "s13";
        String strOut = new String(Main.encode(strSrc.getBytes("GB18030")));
        System.out.println("测试:s13");
        System.out.println("编码:" + strOut);
        String strOut2 = new String(Main.decode(strOut.toCharArray()),
                "GB18030");
        System.out.println("解码:" + strOut2);
    }
}

测试代码来自网络
三个测试源码下载 http://pan.baidu.com/s/1kVfiEs3
测试结果

测试:s13
编码:czEz
解码:s13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值