通过Base64解码问题

时间:2013-08-20 07:38:29

标签: java base64

您好我在解码时遇到问题我的代码在我的结束时运行良好但有时它显示错误,如意外代码:�

我将与您分享我的编码和解码代码,以便我可以获得一些帮助

public class PasswordCheck {

    public static void main(String[] args) {
        String salt = "atscene";


        String password = RandomStringUtils.randomAlphanumeric(8);  

        byte[] passwordHash = null;

        passwordHash = (salt+password).getBytes();
        String str = new String(Base64.encode(passwordHash));

            byte[] passwordHash1 = Base64.decode(str);
            String pass= new String(passwordHash1); 
            System.out.println("Random Password: "+password);
            System.out.println("Coded password: "+str);

            System.out.println(pass.substring(7));


    }

}

Base64.java

public class Base64
{
    static final char[] charTab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".toCharArray();

    public static String encode(byte[] paramArrayOfByte)
    {
        return encode(paramArrayOfByte, 0, paramArrayOfByte.length, null).toString();
    }

    public static StringBuffer encode(byte[] paramArrayOfByte, int paramInt1, int paramInt2,
            StringBuffer paramStringBuffer)
    {
        int l;
        if (paramStringBuffer == null)
            paramStringBuffer = new StringBuffer(paramArrayOfByte.length * 3 / 2);
        int i = paramInt2 - 3;
        int j = paramInt1;
        int k = 0;
        while (j <= i)
        {
            l = (paramArrayOfByte[j] & 0xFF) << 16 | (paramArrayOfByte[(j + 1)] & 0xFF) << 8
                    | paramArrayOfByte[(j + 2)] & 0xFF;
            paramStringBuffer.append(charTab[(l >> 18 & 0x3F)]);
            paramStringBuffer.append(charTab[(l >> 12 & 0x3F)]);
            paramStringBuffer.append(charTab[(l >> 6 & 0x3F)]);
            paramStringBuffer.append(charTab[(l & 0x3F)]);
            j += 3;
            if (k++ < 14)
                continue;
            k = 0;
            paramStringBuffer.append("\r\n");
        }
        if (j == paramInt1 + paramInt2 - 2)
        {
            l = (paramArrayOfByte[j] & 0xFF) << 16 | (paramArrayOfByte[(j + 1)] & 0xFF) << 8;
            paramStringBuffer.append(charTab[(l >> 18 & 0x3F)]);
            paramStringBuffer.append(charTab[(l >> 12 & 0x3F)]);
            paramStringBuffer.append(charTab[(l >> 6 & 0x3F)]);
            paramStringBuffer.append("=");
        }
        else if (j == paramInt1 + paramInt2 - 1)
        {
            l = (paramArrayOfByte[j] & 0xFF) << 16;
            paramStringBuffer.append(charTab[(l >> 18 & 0x3F)]);
            paramStringBuffer.append(charTab[(l >> 12 & 0x3F)]);
            paramStringBuffer.append("==");
        }
        return paramStringBuffer;
    }

    static int decode(char paramChar)
    {
        if ((paramChar >= 'A') && (paramChar <= 'Z'))
            return (paramChar - 'A');
        if ((paramChar >= 'a') && (paramChar <= 'z'))
            return (paramChar - 'a' + 26);
        if ((paramChar >= '0') && (paramChar <= '9'))
            return (paramChar - '0' + 26 + 26);
        switch (paramChar)
        {
        case '+':
            return 62;
        case '/':
            return 63;
        case '=':
            return 0;
        }
        throw new RuntimeException("unexpected code: " + paramChar);
    }

    public static byte[] decode(String paramString)
    {
        ByteArrayOutputStream localByteArrayOutputStream = new ByteArrayOutputStream();
        try
        {
            decode(paramString, localByteArrayOutputStream);
        }
        catch (IOException localIOException)
        {
            throw new RuntimeException();
        }
        return localByteArrayOutputStream.toByteArray();
    }

    public static void decode(String paramString, OutputStream paramOutputStream) throws IOException
    {
        int i = 0;
        int j = paramString.length();
        while (true)
        {
            if ((i < j) && (paramString.charAt(i) <= ' '))
                ++i;
            if (i == j)
                return;
            int k = (decode(paramString.charAt(i)) << 18) + (decode(paramString.charAt(i + 1)) << 12)
                    + (decode(paramString.charAt(i + 2)) << 6) + decode(paramString.charAt(i + 3));
            paramOutputStream.write(k >> 16 & 0xFF);
            if (paramString.charAt(i + 2) == '=')
                return;
            paramOutputStream.write(k >> 8 & 0xFF);
            if (paramString.charAt(i + 3) == '=')
                return;
            paramOutputStream.write(k & 0xFF);
            i += 4;
        }
    }
}

我将编码后的代码作为TIspn`VKyg获取,这是无法从Base64解码的。并且在例外情况下我得到了意外的代码:�。请告诉我这个问题是否有任何解决方案。

0 个答案:

没有答案