`
keepwork
  • 浏览: 332431 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论
阅读更多
开发者博客:http://www.developsearch.com

/**
 * 标准Base64编解码
 * 
 * @author chenxin
 * @version [版本号, 2012-5-21]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
public class Base64 {

	/** Base64编码表。 */
    private 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', '+', '/', };

    /** Base64解码表。 */
    private static byte Base64Decode[] = { -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, // 注意两个63,为兼容SMP,
            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, 63, -1, 63, // “/”和“-”都翻译成63。
            52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, 0, -1, -1, -1,
            0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, // 注意两个0:
            15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, // “A”和“=”都翻译成0。
            -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 Base64()
    {
    }

    /**
     * Base64编码。将字节数组中字节3个一组编码成4个可见字符。
     * 
     * @param b 需要被编码的字节数据。
     * @return 编码后的Base64字符串。
     */
    public static String encode(byte[] arrB)
    {
        int iCode = 0;

        // 按实际编码后长度开辟内存,加快速度
        StringBuffer sb = new StringBuffer(((arrB.length - 1) / 3) << 2 + 4);

        // 进行编码
        for (int i = 0; i < arrB.length; i++)
        {
            iCode |= (arrB[i] << (16 - i % 3 * 8)) & (0xff << (16 - i % 3 * 8));
            if (i % 3 == 2 || i == arrB.length - 1)
            {
                sb.append(Base64Code[(iCode & 0xfc0000) >>> 18]);
                sb.append(Base64Code[(iCode & 0x3f000) >>> 12]);
                sb.append(Base64Code[(iCode & 0xfc0) >>> 6]);
                sb.append(Base64Code[iCode & 0x3f]);
                iCode = 0;
            }
        }

        // 对于长度非3的整数倍的字节数组,编码前先补0,编码后结尾处编码用=代替,
        // =的个数和短缺的长度一致,以此来标识出数据实际长度
        if (arrB.length % 3 > 0)
        {
            sb.setCharAt(sb.length() - 1, '=');
        }
        if (arrB.length % 3 == 1)
        {
            sb.setCharAt(sb.length() - 2, '=');
        }
        return sb.toString();
    }

    /**
     * Base64解码。
     * 
     * @param code 用Base64编码的ASCII字符串
     * @return 解码后的字节数据
     */
    public static byte[] decode(String code)
    {

        // 检查参数合法性
        if (code == null)
        {
            return null;
        }
        int len = code.length();
        if (len % 4 != 0)
        {
            throw new IllegalArgumentException(
                    "Base64 string length must be 4*n");
        }
        if (code.length() == 0)
        {
            return new byte[0];
        }

        // 统计填充的等号个数
        int pad = 0;
        if (code.charAt(len - 1) == '=')
        {
            pad++;
        }
        if (code.charAt(len - 2) == '=')
        {
            pad++;
        }

        // 根据填充等号的个数来计算实际数据长度
        int retLen = len / 4 * 3 - pad;

        // 分配字节数组空间
        byte[] ret = new byte[retLen];

        // 查表解码
        char ch1, ch2, ch3, ch4;
        int i;
        for (i = 0; i < len; i += 4)
        {
            int j = i / 4 * 3;
            ch1 = code.charAt(i);
            ch2 = code.charAt(i + 1);
            ch3 = code.charAt(i + 2);
            ch4 = code.charAt(i + 3);
            int tmp = (Base64Decode[ch1] << 18) | (Base64Decode[ch2] << 12)
                    | (Base64Decode[ch3] << 6) | (Base64Decode[ch4]);
            ret[j] = (byte) ((tmp & 0xff0000) >> 16);
            if (i < len - 4)
            {
                ret[j + 1] = (byte) ((tmp & 0x00ff00) >> 8);
                ret[j + 2] = (byte) ((tmp & 0x0000ff));
            }
            else
            {
                if (j + 1 < retLen)
                {
                    ret[j + 1] = (byte) ((tmp & 0x00ff00) >> 8);
                }
                if (j + 2 < retLen)
                {
                    ret[j + 2] = (byte) ((tmp & 0x0000ff));
                }
            }
        }
        return ret;
    }

    // public static void main(String[] args){
    // String passwd = "NmFkYzEwNDYyOTk2OGNiYTQ2NTZmNDI2MWI1NTZlZTI=";
    // System.out.println("-----------");
    // System.out.println(encode(decode(passwd)));
    // System.out.println(new String(decode(passwd)));
    // CodeTools.printHex(decode(passwd),16);
    // System.out.println("-----------");
    // }


}
分享到:
评论

相关推荐

    pb9_base64_pb调用base64.dll_PB9base64_Base64.dll_glass8y6_pbbase64

    标题中的"pb9_base64_pb调用base64.dll_PB9base64_Base64.dll_glass8y6_pbbase64"涉及到的是PowerBuilder 9(简称PB9)中关于Base64编码的实现。Base64是一种用于在网络上传输二进制数据的编码方式,它将二进制数据...

    labview 图片缩放 base64编码base64解码

    在这个特定的场景中,我们关注的是如何在LabVIEW中处理图片,包括图片的缩放、Base64编码和解码。 1. **图片缩放**: 在LabVIEW中,你可以使用图像处理库来实现图片的缩放功能。这个库提供了各种图像操作函数,...

    Base64.zip_labview base64

    在“Base64.zip_labview base64”这个压缩包中,包含了一个名为“Base64.vi”的虚拟仪器(VI)。这个VI是用LabVIEW编写的,目的就是提供一个纯LabVIEW环境下的Base64编码解决方案。下面我们将详细探讨如何在LabVIEW...

    base64 加解码 base64转hex Base64转图片 图片转Base64工具,比网上其它的方便好用,支持大于1M内容

    Base64是一种在互联网上广泛使用的编码方式,它将任意二进制数据转换为可打印的ASCII字符,以便在网络传输中不受限制。这种编码方法基于一个64字符的字母数字表,包括大小写字母、数字以及"+"和"/",末尾可能带有...

    Base64转二进制文件,Base64 To File

    Base64编码是一种常见的数据编码方式,主要用于在不支持二进制传输的环境中传递二进制数据。它将任意的二进制数据转化为ASCII字符序列,这样就可以在文本格式的邮件、网页源代码等场景中方便地使用。Base64编码会将3...

    BASE64图片解码_解码_vba图片base64_base64_VBa_图片_

    在Excel中使用VBA(Visual Basic for Applications)解码BASE64编码的图片是一项常见的编程任务,特别是当你需要处理从网络或数据库中获取的BASE64格式的图像数据时。BASE64是一种用于将二进制数据转换为可打印ASCII...

    Android图片的Base64编码与解码及解码Base64图片方法

    在Android开发中,有时我们需要将图片转换为Base64编码的形式以便在网络传输或者存储时使用。Base64编码是一种常见的二进制数据转化为文本的方法,它通过使用64个可打印字符来表示原本的二进制数据,使得数据可以在...

    VB JPG转base64和base64转JPG.rar

    这个“VB JPG转base64和base64转JPG.rar”压缩包文件包含的可能是两个VB程序,分别用于将JPG图片编码为Base64字符串和将Base64字符串解码回JPG图片。 首先,让我们深入了解一下Base64编码的原理。Base64编码将每3个...

    Base64.dll(Base64编解码,附VB示例)

    Base64编码和解码库,支持API调用和COM调用,输入参数支持VB的字节数组Byte(),输出支持VB的字节数组Byte()和...Public Declare Sub DecodeFromVBStringEx Lib "Base64" (ByRef Dest() As Byte, ByRef Src As String)

    sun.misc.BASE64Decoder(Android Base64Jar包以及Java源代码)

    sun.misc.BASE64Decoder 其中包括 Android Base64Jar包 以及Java源代码 sun.misc.BASE64Decoder 其中包括 Android Base64Jar包 以及Java源代码 sun.misc.BASE64Decoder 其中包括 Android Base64Jar包 以及...

    BASE64Encoder及BASE64Decoder的源码

    在IT行业中,Base64是一种常见的数据编码方法,主要用于将二进制数据转换为ASCII字符串,以便在网络上传输或者存储。Base64Encoder和Base64Decoder是处理这种编码和解码过程的工具。本文将深入探讨这两个概念,以及...

    Base64引入包

    Base64是一种在网络上传输和存储二进制数据时常用的数据编码方式,它将二进制数据转换为可打印的ASCII字符序列。在Java中,Base64编码主要用于处理包含二进制数据的字符串,例如图片、PDF文档或加密密钥等。Base64...

    BASE64Encoder 与 BASE64Decoder 源代码

    在Java中,`BASE64Encoder`和`BASE64Decoder`是两个核心类,分别用于对数据进行BASE64编码和解码。 `BASE64Encoder`类: 这个类在Java SDK中位于`javax.crypto`包下,主要负责将字节序列(byte array)转换为BASE...

    BASE64Encoder.jar

    在IT领域,Base64是一种广泛使用的编码方式,主要用于将二进制数据转换为可打印的ASCII字符,以便在网络上传输或存储。标题中的"BASE64Encoder.jar"表明这是一个Java应用程序,它提供了Base64编码的功能。描述中提到...

    Base64 编码和解码

    Base64是一种常见的数据编码方式,它将任意的二进制数据转换成可打印的ASCII字符串,以便在网络上传输或者存储。在JavaScript中,Base64编码和解码是经常用到的功能,尤其是在处理图像、JSON数据或者进行跨平台通信...

    BASE64Encoder.zip

    BASE64编码是一种常见的数据编码方式,特别是在网络通信和数据存储中广泛使用。它将任意二进制数据转换成可打印的ASCII字符序列,以便在不支持二进制传输的环境中进行传输。在这个"BASE64Encoder.zip"压缩包中包含了...

    java base64的jar包

    Java Base64是一个用于处理Base64编码的库,它为Java开发者提供了便捷的方式来编码和解码Base64数据。Base64是一种在网络上传输二进制数据时常用的编码方式,因为HTTP、电子邮件等协议主要处理ASCII字符,而Base64...

    C# Base64加密解密

    在IT领域,Base64是一种常见的数据编码方法,主要用于在不支持二进制传输的环境中传递数据,如电子邮件系统。C#是微软开发的一种面向对象的编程语言,广泛应用于Windows应用开发,包括WinForms应用程序。在C# ...

Global site tag (gtag.js) - Google Analytics