`
mushme
  • 浏览: 778454 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

mark一个base64的编码和解码工具类

 
阅读更多
package com.frady.util;

import java.io.ByteArrayOutputStream;
/**
 * Base64编码/解码器
 */
public class Base64Util {
	private final static char[] BASE64_ENCODING_TABLE;
    private final static byte[] BASE64_DECODING_TABLE;

    static 
    {
        BASE64_ENCODING_TABLE="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".toCharArray();
        BASE64_DECODING_TABLE=new byte[]
        {
            -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
            -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1,
            -1, 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,-1,-1,-1,-1,-1,
            -1,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,-1,-1,-1,-1,-1
        };
    }
    
    private Base64Util()
    { 
    }
    
    /**
     * 将数据进行Base64编码。
     * @param data 数据
     * @param offset 数据中的初始偏移量
     * @param length 写入的字节数
     * @return 编码后的字符串
     */
    public final static String encode(byte[] data,int offset,int length)
    {
        if(data==null)
        {
            return null;
        }
        
        StringBuffer buffer=new StringBuffer();
        int[] temp=new int[3];
        int end=offset+length;
        
        while(offset<end)
        {            
            temp[0]=data[offset++]&255;
            
            if(offset==data.length)
            {
                buffer.append(BASE64_ENCODING_TABLE[(temp[0]>>>2)&63]);
                buffer.append(BASE64_ENCODING_TABLE[(temp[0]<<4)&63]);
                buffer.append('=');
                buffer.append('=');
                
                break;
            }
            
            temp[1]=data[offset++]&255;
            
            if(offset==data.length)
            {
                buffer.append(BASE64_ENCODING_TABLE[(temp[0]>>>2)&63]);
                buffer.append(BASE64_ENCODING_TABLE[((temp[0]<<4)|(temp[1]>>>4))&63]);
                buffer.append(BASE64_ENCODING_TABLE[(temp[1]<<2)&63]);
                buffer.append('=');
                
                break;
            }
            
            temp[2]=data[offset++]&255;
            
            buffer.append(BASE64_ENCODING_TABLE[(temp[0]>>>2)&63]);
            buffer.append(BASE64_ENCODING_TABLE[((temp[0]<<4)|(temp[1]>>>4))&63]);
            buffer.append(BASE64_ENCODING_TABLE[((temp[1]<<2)|(temp[2]>>>6))&63]);
            buffer.append(BASE64_ENCODING_TABLE[temp[2]&63]);
        }
        
        return buffer.toString();
    }
    
    /**
     * 将数据进行Base64编码。
     * @param data 数据
     * @return 编码后的字符串
     */
    public final static String encode(byte[] data)
    {
        return encode(data,0,data.length);
    }

    /**
     * 将字符串进行Base64编码。
     * @param str 字符串
     * @return 编码后的字符串
     */
    public final static String encode(String str)
    {
        return encode(str.getBytes());
    }
    
    /**
     * 对使用Base64编码的字符串进行解码。
     * @param str 经过编码的字符串
     * @return 解码后的数据
     */
    public final static String decode(String str)
    {
        if(str==null)
        {
            return null;
        }

        ByteArrayOutputStream buffer=new ByteArrayOutputStream();
        byte[] data=str.getBytes();
        int[] temp=new int[4];
        int index=0;
        
        while(index<data.length)
        {
            do
            {
                temp[0]=BASE64_DECODING_TABLE[data[index++]];
            }while(index<data.length&&temp[0]==-1);
            
            if(temp[0]==-1)
            {
                break;
            }

            do
            {
                temp[1]=BASE64_DECODING_TABLE[data[index++]];
            }while(index<data.length&&temp[1]==-1);
            
            if(temp[1]==-1)
            {
                break;
            }
            
            buffer.write(((temp[0]<<2)&255)|((temp[1]>>>4)&255));

            do
            {
                temp[2]=data[index++];
                
                if(temp[2]==61)
                {
                    return new String(buffer.toByteArray());
                }
                
                temp[2]=BASE64_DECODING_TABLE[temp[2]];
            }while(index<data.length&&temp[2]==-1);
            
            if(temp[2]==-1)
            {
                break;
            }
            
            buffer.write(((temp[1]<<4)&255)|((temp[2]>>>2)&255));

            do
            {
                temp[3]=data[index++];
                
                if(temp[3]==61)
                {
                    return new String(buffer.toByteArray());
                }
                
                temp[3]=BASE64_DECODING_TABLE[temp[3]];
            }while(index<data.length&&temp[3]==-1);
            
            if(temp[3]==-1)
            {
                break;
            }
            
            buffer.write(((temp[2]<<6)&255)|temp[3]);
        }
        
        return new String(buffer.toByteArray());
    }
    
    public static void main (String args[]){
    	System.out.println(Base64Util.encode("中华人民共和国"));
    	System.out.println(Base64Util.decode("1tC7qsjLw/G5srrNufo="));
    	
    	
    	System.out.println(Base64Util.encode("123abc"));
    	System.out.println(Base64Util.decode("MTIzYWJj"));
    }
}




分享到:
评论

相关推荐

    Base64:支持SIMD的Base64编码解码,也支持base64Url

    一个用于base64编码/解码以及base64Url支持的.NET库。 可以对byte类型(对于UTF-8)或char类型的缓冲区进行编码。 解码可以从类型为byte (对于UTF-8)或char类型的缓冲区中读取。 编码/解码支持缓冲区链,例如...

    图片base64转换

    主要是实现图片和base64互相转换,里面包含图片转换为base64的代码,base64转换为图片的代码

    开发工具Markdown工具marktext-x64-win免安装版

    开发工具Markdown工具marktext-x64-win免安装版

    MarkMark v1.0.zip

    MarkMark是一款极其智能轻便的设计图标注、测量工具,融入放大镜和智能区域选取功能。MarkMark能让设计师更快捷高效的完成标注,标注从未变得如此简单 自动测量区域 使用测量区域工具M的同时,点按Tab键,会自动...

    marktext-x64-win0.17.1-中文包.rar

    marktext-x64-win0.17.1-中文包.rar,中文包,解压即用,最新版本

    marktext的中文包

    marktext的中文包marktext的中文包

    MarkMark图像测量工具

    MarkMark是一款绿色小巧且简单实用的图像测量工具,为用户提供自动测量区域,像素,对图像进行精细测量,提供放大镜等功能,能让设计师更快捷高效的完成标注,使用MarkMark,标注从未变得如此简单。

    marktext-0.15.0-x86_64.AppImage

    新型轻量级Markdown编辑器——Marktext的安装包,源地址下载速度奇慢,所以在这里保存一份方便下载。

    mark地址修改工具

    mark地址修改

    一个高层线程工具类(Timer)---马克-to-win java视频

    一个高层线程工具类(Timer)---马克-to-win java视频

    MarkText.zip

    MarkText是一个MIT许可的开源项目,最新的版本可以从GitHub发布页面免费下载。MarkText还在发展中,它的发展离不开所有的赞助商。 特点: 实时预览(所见即所得)和一个干净和简单的界面。 支持CommonMark Spec, ...

    好用的mark编辑工具

    好用的markdown编辑工具,亲测,免费,界面友好,操作简单

    Mark点匹配算法

    Mark点匹配算法,一个开卷设备,有一盘料带,一行有16个件,料带上有若干行,CCD去一行一行的检测,当检测到其中一行有一个或多个不良的工件时,会把不良工件的位置坐标给PLC(主要是给行坐标,也就是这一行上的第几...

    算术编码压缩类

    n阶自适应算术编码压缩算法的C++类 参考 :Mark Nelson的实例

    bios工具之mark

    bios添加slic2.1的工具,具体使用见说明。 BIOS必须符合以下条件: 1、必须是LENOVE的AMI APTIO EFI BIOS;(AMIBIOS8.x不行); 2、MARK的OEM TABLE ID必须与原机相同;

    photo mark 水印工具

    一个很小很实用的水印工具,你可以添加文字水印,也可以添加图片水印。

    哈夫曼编码译码器

    广工数据结构课程设计 哈夫曼树结构体定义 typedef struct Huffmantree { char ch; //键值 int weight,mark; //weight为权值,mark为标志域 ...使用链树存储,建立哈夫曼函数,编码函数,译码函数来实现功能。

    marktext最新免安装版本

    最新免安装版本。下载该软件时,由于在github托管,安装包是放在亚马逊云上的,时经常只有几Kb速度,还经常失败。所以下载好放这儿,以后会经常更新。

    分页工具类

    service 实现类 public PageResult queryPageList(Integer page, Integer rows, User user) { PageResult pageResult = new PageResult(); HashMap, Object&gt; hashMap = new HashMap, Object&gt;(); hashMap.put(...

    MarkMark.exe

    MarkMark.exe  MarkMark是一款非常实用的最新图片测量软件。这款图像测量系统同时也是一款简单设计标注、测量工具,它有自动测量区域像素、放大区域等功能,适用于需要对图像进行精确测量的用户使用!

Global site tag (gtag.js) - Google Analytics