`
conkeyn
  • 浏览: 1523095 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

base64 编码 换行问题

    博客分类:
  • Java
 
阅读更多

 

 

public final class Base64 {
    private static final byte[] DECODE_TABLE = new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 0,
            0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 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, 0,
            0, 0, 0, 0 };

    // "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ "
    private static final byte[] ENCODE_TABLE = new byte[] { 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113,
            114, 115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47 };

    static {
        // create encode table
        // ENCODE_TABLE = new byte[64];
        int index = 0;
        for (char c = 'A'; c <= 'Z'; c++)
            ENCODE_TABLE[index++] = (byte) c;
        for (char c = 'a'; c <= 'z'; c++)
            ENCODE_TABLE[index++] = (byte) c;
        for (char c = '0'; c <= '9'; c++)
            ENCODE_TABLE[index++] = (byte) c;
        ENCODE_TABLE[index++] = (byte) '+';
        ENCODE_TABLE[index++] = (byte) '/';

        // create decode table
        for (int i = 0; i < 64; i++)
            DECODE_TABLE[(int) ENCODE_TABLE[i]] = (byte) i;
    }

    private Base64() {
    }

    public static byte[] encode(byte[] data) {
        if (data == null)
            return null;

        int fullGroups = data.length / 3;
        int resultBytes = fullGroups * 4;
        if (data.length % 3 != 0)
            resultBytes += 4;

        byte[] result = new byte[resultBytes];
        int resultIndex = 0;
        int dataIndex = 0;
        int temp = 0;
        for (int i = 0; i < fullGroups; i++) {
            temp = (data[dataIndex++] & 0xff) << 16 | (data[dataIndex++] & 0xff) << 8 | data[dataIndex++] & 0xff;

            result[resultIndex++] = ENCODE_TABLE[(temp >> 18) & 0x3f];
            result[resultIndex++] = ENCODE_TABLE[(temp >> 12) & 0x3f];
            result[resultIndex++] = ENCODE_TABLE[(temp >> 6) & 0x3f];
            result[resultIndex++] = ENCODE_TABLE[temp & 0x3f];
        }
        temp = 0;
        while (dataIndex < data.length) {
            temp <<= 8;
            temp |= data[dataIndex++] & 0xff;
        }
        switch (data.length % 3) {
        case 1:
            temp <<= 8;
            temp <<= 8;
            result[resultIndex++] = ENCODE_TABLE[(temp >> 18) & 0x3f];
            result[resultIndex++] = ENCODE_TABLE[(temp >> 12) & 0x3f];
            result[resultIndex++] = 0x3D;
            result[resultIndex++] = 0x3D;
            break;
        case 2:
            temp <<= 8;
            result[resultIndex++] = ENCODE_TABLE[(temp >> 18) & 0x3f];
            result[resultIndex++] = ENCODE_TABLE[(temp >> 12) & 0x3f];
            result[resultIndex++] = ENCODE_TABLE[(temp >> 6) & 0x3f];
            result[resultIndex++] = 0x3D;
            break;
        default:
            break;
        }

        return result;
    }

    public static byte[] decode(byte[] base64Data) {
        if (base64Data == null)
            return null;
        if (base64Data.length == 0)
            return new byte[0];
        if (base64Data.length % 4 != 0)
            throw new IllegalArgumentException("数据不完整,长度为: " + base64Data.length);

        byte[] result = null;
        int groupCount = base64Data.length / 4;

        int lastData = base64Data.length;
        while (base64Data[lastData - 1] == 0x3D) {
            if (--lastData == 0)
                return new byte[0];
        }
        result = new byte[lastData - groupCount];

        int temp = 0;
        int resultIndex = 0;
        int dataIndex = 0;
        for (; dataIndex + 4 < base64Data.length;) {
            temp = DECODE_TABLE[base64Data[dataIndex++]];
            temp = (temp << 6) + DECODE_TABLE[base64Data[dataIndex++]];
            temp = (temp << 6) + DECODE_TABLE[base64Data[dataIndex++]];
            temp = (temp << 6) + DECODE_TABLE[base64Data[dataIndex++]];

            result[resultIndex++] = (byte) ((temp >> 16) & 0xff);
            result[resultIndex++] = (byte) ((temp >> 8) & 0xff);
            result[resultIndex++] = (byte) (temp & 0xff);
        }

        temp = 0;
        int j = 0;
        for (; dataIndex < base64Data.length; dataIndex++, j++)
            temp = (temp << 6) + DECODE_TABLE[base64Data[dataIndex]];
        for (; j < 4; j++)
            temp <<= 6;

        result[resultIndex++] = (byte) ((temp >> 16) & 0xff);
        if (base64Data[dataIndex - 2] != '=')
            result[resultIndex++] = (byte) ((temp >> 8) & 0xff);
        if (base64Data[dataIndex - 1] != '=')
            result[resultIndex++] = (byte) (temp & 0xff);

        return result;
    }

    public static void main(String[] args) {
        Base64 base64 = new Base64();
       byte [] s= base64.encode("http://212.201.208.22:2212/entry?C=0300000001&ContentID=000001000000045903&F=72103_72104".getBytes());
        System.out.println(new String(s));
        s=base64.decode(s);
        System.out.println(new String(s));
    }
}

 

 

分享到:
评论

相关推荐

    Delphi Base64 演示及躲坑

    本主题聚焦于在Delphi编程环境中如何使用Base64进行编码和解码,以及在与其他语言对接时可能遇到的问题和解决策略。 首先,让我们详细了解Delphi中原生的Base64实现。Delphi提供了`System.NetEncoding`单元,其中...

    C实现将BMP文件转base64编码

    Base64是一种数据编码方法,常用于在网络上传输二进制数据,因为它可以把任意二进制数据转化为ASCII字符,从而可以在纯文本格式下传输。这个项目实现了用C/C++语言将BMP文件转换为Base64编码,这对于在HTTP协议中...

    Base64与byte[]相互转换

    ### Base64与byte[]相互转换 ...通过以上步骤,我们可以清晰地理解如何在Java中实现Base64与byte[]之间的转换以及如何处理Base64中的换行符问题。这对于实际开发工作中处理二进制数据或字符串转换非常有用。

    base64编码解码源码

    Base64编码是一种广泛用于网络数据传输和存储的编码方式,它将任意二进制数据转化为可打印的ASCII字符序列。这种编码方式基于64个字符的字母数字表,包括大小写字母、数字以及"+"和"/",并用"\n"作为每76个字符后的...

    Base64编码、解码类,支持中文vb源码

    在VB中实现Base64编码和解码功能,可以帮助开发者处理二进制数据的存储和传输问题,尤其是当这些数据包含非ASCII字符,例如中文时。 Base64编码的过程通常是这样的:首先,将输入的二进制数据按照3个字节一组进行...

    base64 加解码 base64转hex Base64转图片 图片转Base64工具 可选Unicode UTF8等编码格式

    base64 加解码 base64转hex Base64转图片 图片转Base64工具 可选Unicode UTF8等编码格式。前一个不 支持换行,此版本已支持。 (使用前,麻烦安装DotNet4.0以上版本)

    c\c++base64

    在IT领域,Base64是一种常见的数据编码方法,主要用于将任意二进制数据转换成ASCII字符串,以便在不支持二进制传输的环境下(如电子邮件)进行传递。在这个压缩包中,我们有一个名为"Base64Demo"的项目,它包含了一...

    base64编解码C/C++实现

    Base64是一种网络上常见的数据编码方式,它将任意二进制数据转化为可打印的ASCII字符,以便在电子邮件等文本环境中传输。Base64编码基于64个字符的字符集,包括大小写字母、数字以及"+"和"/",并且通常在末尾添加一...

    BASE64的算法源代码

    这个压缩包包含的文件可能是一个关于BASE64编码的示例程序或者代码库,比如`TestBase64.vbg`可能是一个VBScript的工程文件,`TestApp`可能是应用测试程序,而`Base64`可能包含了BASE64编码的实现代码。 BASE64编码...

    Base64加解码vc++源码

    Base64编码的关键在于它的字符集,它包含大小写字母(A-Z, a-z)、数字(0-9)以及"+"和"/",最后用"\n"作为换行符(在标准Base64中,换行不是必须的,但在某些实现中为了格式化可能被使用)。在编码过程中,如果...

    Base64算法完整源码与调用方法.rar

    Base64是一种广泛使用的编码方式,它将任意的二进制数据转换成可打印的ASCII字符,以便在电子邮件、文本文件和其他不支持二进制传输的环境中进行传输。这种编码方式将每3个字节(24位)的二进制数据转化为4个6位的...

    base64的java实现方法

    Base64字符集包括大小写字母、数字和两个特殊字符'+', '/',同时在传输过程中通常会用'\n'进行换行,但在编码和解码时需要去除这些换行符。 在Java中,我们可以使用`java.util.Base64`类来实现Base64的编码和解码。...

    Base64 编解码工具

    为了确保编码后的字符串在传输过程中不会因换行或空格产生问题,通常会在末尾添加一个或多个等号(`=`)作为填充,以使编码后的长度是4的倍数。等号不携带任何信息,仅用作校验。 在本"Base64编码解码工具"中,提供...

    base64 encode 中文版

    ### Base64编码标准中文解析 #### 一、概述 Base64编码是一种常见的二进制数据编码方式,主要用于在电子邮件和其他需要传输非文本数据的应用中。本文章将基于RFC2045标准中文版对Base64编码的原理、算法及应用进行...

    c++ 图片转base64流

    3. **Base64编码**:为了将二进制数据转换为Base64字符串,可以编写自定义函数或使用现成的库,如`openssl`库的` BIO_base64`功能,或者`Poco`库的`Net`模块。这些库提供了Base64编码的功能,可以接受字节流并返回...

    c语言版base64编解码算法实现.rar

    将字符串str+换行 编码为base64字符串输出。 格式:echo -n "str" | base64 将字符串str编码为base64字符串输出。注意与上面的差别。(2011.08.01 补充) 格式:base64 file 从指定的文件file中读取数据,...

    Base64码表(邮件转换代码)

    Base64是一种编码方式,常用于在不支持二进制传输的环境中,如...它通过将3个8位字节转换为4个6位的块,使用64个字符的编码表进行映射,并在必要时使用'='进行填充,同时为了适应邮件格式,每76个字符后会添加换行。

    base64编解码 源代码及测试用例

    - **换行处理**:Base64字符串中可能包含换行符,检验解码器是否能正确处理。 - **错误检测**:测试解码时遇到错误的情况,如无效的Base64字符或长度不匹配。 `base64code`这个文件很可能包含了Base64编解码的C++源...

    二进制文件到Base64互转C#源代码

    本文将深入探讨如何使用C#语言实现二进制文件与Base64字符串之间的转换,以及处理换行问题。 Base64是一种用于将二进制数据表示为ASCII字符串的编码方式,常用于在电子邮件、JSON和HTTP协议中传输非文本内容。C#...

    Python库 | pybase64-1.2.1-cp310-cp310-win_amd64.whl

    4. **不带换行的编码**:默认的Base64编码会在76个字符后添加换行符,以适应邮件系统的限制。但`aiohttp`库提供了`standard_b64encode()`和`standard_b64decode()`,不包含这种行为。 5. **性能优化**:`pybase64`...

Global site tag (gtag.js) - Google Analytics