Android Base64字符串检测

时间:2014-09-04 09:31:18

标签: android string base64

我想要实现的是检测到base64字符串 ... 尝试 接近,但并没有为所有的琴弦工作。

TRIED APPROACH

  

搜索android.util.Base64包,但它也没有提供检测base64字符串的任何功能...... !!!

TRIED APPROACH

  

使用的正则表达式在Stackoverflow上高度赞成但没有工作!!

     

^([A-ZA-Z0-9 + /] {4})*([A-ZA-Z0-9 + /] {4} | [A-ZA-Z0-9 + /] {3- } = | [A-ZA-Z0-9 + / {2} ==)$

     

它接受" Clip" string as base64即使它不是......

TRIED APPROACH

  

:*(([A-ZA-Z0-9 + /] {4}?):[A-ZA-Z0-9 + / {2} == | [A-ZA-Z0-9 + /] {3} = | [A-ZA-Z0-9 + /] {4})

     

即使这也有同样的问题.... !!

TRIED APPROACH

  

使用最新的commons-codec库(版本1.9)..但是,isBase64(String str)方法中没有方法定义(谷歌搜索中的许多人都强烈推荐).. !!

     

为了解决这个问题,我搜索了很多,但没有找到合适的答案...... !!

有人可以帮我解决这个问题并让我为所有字符串设置解决方案吗?

1 个答案:

答案 0 :(得分:0)

试试这段代码

public class Base64 {

private Base64() {
    super();
}

/**
 * Encode some data and return a String.
 */
public final static String encode(byte[] d) {
    if (d == null)
        return null;
    byte data[] = new byte[d.length + 2];
    System.arraycopy(d, 0, data, 0, d.length);
    byte dest[] = new byte[(data.length / 3) * 4];

    // 3-byte to 4-byte conversion
    for (int sidx = 0, didx = 0; sidx < d.length; sidx += 3, didx += 4) {
        dest[didx] = (byte) ((data[sidx] >>> 2) & 077);
        dest[didx + 1] = (byte) ((data[sidx + 1] >>> 4) & 017 | (data[sidx] << 4) & 077);
        dest[didx + 2] = (byte) ((data[sidx + 2] >>> 6) & 003 | (data[sidx + 1] << 2) & 077);
        dest[didx + 3] = (byte) (data[sidx + 2] & 077);
    }

    // 0-63 to ascii printable conversion
    for (int idx = 0; idx < dest.length; idx++) {
        if (dest[idx] < 26)
            dest[idx] = (byte) (dest[idx] + 'A');
        else if (dest[idx] < 52)
            dest[idx] = (byte) (dest[idx] + 'a' - 26);
        else if (dest[idx] < 62)
            dest[idx] = (byte) (dest[idx] + '0' - 52);
        else if (dest[idx] < 63)
            dest[idx] = (byte) '+';
        else
            dest[idx] = (byte) '/';
    }

    // add padding
    for (int idx = dest.length - 1; idx > (d.length * 4) / 3; idx--) {
        dest[idx] = (byte) '=';
    }
    return new String(dest);
}

/**
 * Encode a String using Base64 using the default platform encoding
 **/
public final static String encode(String s) {
    return encode(s.getBytes());
}

/**
 * Decode data and return bytes.
 */
public final static byte[] decode(String str) {
    if (str == null)
        return null;
    byte data[] = str.getBytes();
    return decode(data);
}

/**
 * Decode data and return bytes. Assumes that the data passed in is ASCII
 * text.
 */
public final static byte[] decode(byte[] data) {
    int tail = data.length;
    while (data[tail - 1] == '=')
        tail--;
    byte dest[] = new byte[tail - data.length / 4];

    // ascii printable to 0-63 conversion
    for (int idx = 0; idx < data.length; idx++) {
        if (data[idx] == '=')
            data[idx] = 0;
        else if (data[idx] == '/')
            data[idx] = 63;
        else if (data[idx] == '+')
            data[idx] = 62;
        else if (data[idx] >= '0' && data[idx] <= '9')
            data[idx] = (byte) (data[idx] - ('0' - 52));
        else if (data[idx] >= 'a' && data[idx] <= 'z')
            data[idx] = (byte) (data[idx] - ('a' - 26));
        else if (data[idx] >= 'A' && data[idx] <= 'Z')
            data[idx] = (byte) (data[idx] - 'A');
    }

    // 4-byte to 3-byte conversion
    int sidx, didx;
    for (sidx = 0, didx = 0; didx < dest.length - 2; sidx += 4, didx += 3) {
        dest[didx] = (byte) (((data[sidx] << 2) & 255) | ((data[sidx + 1] >>> 4) & 3));
        dest[didx + 1] = (byte) (((data[sidx + 1] << 4) & 255) | ((data[sidx + 2] >>> 2) & 017));
        dest[didx + 2] = (byte) (((data[sidx + 2] << 6) & 255) | (data[sidx + 3] & 077));
    }
    if (didx < dest.length) {
        dest[didx] = (byte) (((data[sidx] << 2) & 255) | ((data[sidx + 1] >>> 4) & 3));
    }
    if (++didx < dest.length) {
        dest[didx] = (byte) (((data[sidx + 1] << 4) & 255) | ((data[sidx + 2] >>> 2) & 017));
    }
    return dest;
}

它对我有用