`
mushme
  • 浏览: 789348 次
  • 性别: 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"));
    }
}




分享到:
评论

相关推荐

    获取编码格式的工具类

    3. **读取指定编码的文件**:该工具类可能提供一个方法,接受用户提供的编码参数,读取相应编码的文件内容,避免因误判编码导致的乱码问题。 4. **写入文件时设置编码**:与读取类似,工具类也应提供方法允许开发者...

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

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

    java检测编码工具类

    Java编码检测工具类是Java开发中非常实用的一个组件,它能够帮助开发者准确地识别和处理各种文件的编码格式。在处理跨平台或者不同系统间的数据交换时,编码问题常常成为困扰,因为不同的操作系统和程序可能使用不同...

    Matlab技术的AMI编码和解码的实现

    总结来说,AMI编码是一种有效减少直流偏移的编码方式,而Matlab则是一个强大的工具,用于实现和分析这种编码技术。通过编写和理解相关的Matlab代码,我们可以深入理解AMI编码的工作原理,进而将其应用于实际的数字...

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

    6. `ffmpeg.dll`:FFmpeg是一个强大的开源多媒体处理框架,包含音视频编码、解码、转换等功能。在Mark Text中,可能用于处理嵌入的多媒体内容。 7. `Mark Text.exe`:这是Mark Text编辑器的主执行文件,双击运行此...

    java验证文件真实格式和编码格式工具类

    1. **BOM(Byte Order Mark)检测**:某些编码,如UTF-8和UTF-16,会在文件开始处包含一个BOM标记,可以直接识别出编码类型。 2. **字符集分析**:通过对文件内容进行统计分析,如频度最高的字符、异常字符等,可以...

    JAVA自动获取文件的编码工具类

    标题中的"JAVA自动获取文件的编码工具类"正是这样一个工具,通过提供的`EncodingDetect.getJavaEncode(String, filePath)`方法,可以便捷地识别文件的编码类型。 `EncodingDetect.getJavaEncode(String, filePath)`...

    Matlab技术的AMI编码和解码

    其中,交替标记反转(Alternate Mark Inversion,简称AMI)编码是一种广泛应用于基带信号传输中的编码方法,它能有效减少直流成分,避免长串相同电平信号的出现,从而提高信号的可检测性和可靠性。本文将基于Matlab...

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

    《MarkText:一款高效易用的...如果你需要一款高效、简洁的Markdown编辑工具,那么MarkText无疑是一个值得尝试的优秀选择。这个“marktext-x64-win0.17.1-中文包.rar”压缩文件,正是你开始Markdown写作之旅的好起点。

    VB实现HDB3编码解码

    VB实现的HDB3编码解码涉及到数字信号传输中的一个重要编码技术,High Density Bipolar with 3-level pulse (HDB3)编码。这种编码方法主要用于提高传输效率和纠错能力,尤其是在电话交换网络和数字视频广播系统中。...

    图片base64转换

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

    基于FPGA的HDB3编码和解码器的设计与实现.pdf

    HDB3编码规则要求连续四个零被编码为一个特殊的模式,且相邻两个非零脉冲之间需要有奇数个“1”脉冲,从而保证了编码过程中没有直流分量的累积。 2. FPGA与HDB3编解码器的设计:FPGA(Field-Programmable Gate ...

    【信号处理】基于HDB3实现数据编码解码含Matlab源码.zip

    标题中的“【信号处理】基于HDB3实现数据编码解码含Matlab源码”指出,这个压缩包文件包含的是关于信号处理领域的学习资源,特别是关于HDB3(High Density Bipolar 3)编码和解码的实现。HDB3是一种广泛应用于通信...

    算术编码压缩类

    总的来说,"算术编码压缩类"是一个结合了概率统计和位操作的复杂数据压缩工具,通过C++实现可以提高编码效率,并且利用自适应性来优化压缩效果。理解并实现这样一个类需要深入理解算术编码的工作原理,同时也需要...

    一个判断字符串编码类型的类,支持多种编码

    本文将深入探讨标题和描述中提到的“一个判断字符串编码类型的类”,主要关注其在C#中的实现,并如何能应用于C++。 首先,我们要理解字符编码的基本概念。字符编码是将字符与数字(通常为二进制)进行映射的过程,...

    编码转换工具

    在IT领域,编码转换是一个非常重要的主题,尤其是在处理多语言和跨平台的数据交换时。"编码转换工具"正如其标题所示,是一个专门用于处理不同字符编码之间转换的应用程序。在这个场景中,主要涉及到两种常见的字符...

    易语言-Unicode编码解码.e

    这个“易语言-Unicode编码解码.e”文件显然是一个易语言编写的应用程序或例程,专门用于处理Unicode编码和解码的问题。 Unicode是一种广泛使用的字符编码标准,它为世界上几乎所有的字符提供了唯一的数字表示,包括...

    AMI编解码的仿真程序设计

    在通信领域,AMI(Alternate Mark Inversion)编码是一种常见的模拟线路信号编码技术,主要用于将数字数据转换为适合在电话线或其他模拟信道上传输的模拟信号。本项目是基于AMI编码的仿真程序设计,旨在帮助理解和...

    MarkMark图像测量工具

    MarkMark支持像素级别的测量,可以精确到每一个像素点,这对于网页设计、UI设计等需要精确尺寸的工作来说是非常必要的。用户可以轻松获取任何图形或元素的像素宽度、高度以及对角线长度等信息。 ### 精细测量 Mark...

    marktext最新免安装版本

    作为一个专注于Markdown笔记的工具,它提供了流畅的写作体验,支持实时预览,使得文本排版和代码高亮等功能变得简单易用。此“最新免安装版本”尤其方便,无需繁琐的安装过程,用户可以直接运行,极大地提高了效率。...

Global site tag (gtag.js) - Google Analytics