从String转换为长数组并返回不起作用

时间:2014-12-02 09:59:23

标签: java string encoding base64 long-integer

我很抱歉这个令人困惑的标题,但我无法弄清楚如何用更好的标题来描述我的问题。

我正在编写一个程序,将一个字符串转换为一个应该是可逆的长向量(以便读回信息)。转换为长阵列对我来说似乎没问题。我使用base 64作为中间步骤,以便以更好的方式创建字节数,以处理我必须执行的其他处理部分。

    public long[] str2long(String s)
    {
        final byte[] authBytes = s.getBytes(StandardCharsets.UTF_8);
        final String encoded = Base64.getEncoder().encodeToString(authBytes);
        long[] array = new long[encoded.length()];
        int i=0;
        for(char c: encoded.toCharArray()){
            array[i] = (long) c;
//             System.out.print(array[i] + " ");
             i++;
        }
        return array;
    }

问题在于,即使很难,下面的代码似乎与上面的代码完全相反,实际上它并非如此,并且基本64反向转换会出现此错误:Illegal base64 character 5b

public String long2str(long[] array)
{
    char[] chArray = new char[array.length];
    int i=0;
    for(long c: array){
        chArray[i] = (char) c;
        i++;
    }
    String s = Arrays.toString(chArray);
    final byte[] decoded= Base64.getDecoder().decode(s);
    try {
        s = new String(decoded, "UTF-8");
        return s;
    } catch (UnsupportedEncodingException ex) {
        Logger.getLogger(Encryption.class.getName()).log(Level.SEVERE, null, ex);
    }
    return null;
}

所以,我的问题是:

我遗漏的第二种方法有什么不同?我想它可能是StandardCharsets.UTF_8,但我不确定。

如何让这个功能long2str(long[] array)像这样工作 long2str(str2long(String s)) == String s

如果您愿意,我可以发布我正在使用的测试用例来尝试验证此代码。

1 个答案:

答案 0 :(得分:1)

long2str方法中,更改:

String s = Arrays.toString(chArray);

为:

String s = new String(chArray);

当您使用Arrays.toString()时,您将获得String格式的[Y, W, J, j, Z, G, V, m, Z, 2, h, ...],这不是有效的基本64字符串。要获取包含String所有字符的chArray,您应该使用相应的String构造函数。