使用DatatypeConverter时,Java字节数组不会转换回其原始字符串

时间:2015-06-08 11:27:45

标签: java arrays byte java-8

我使用DatatypeConverter将我的字符串转换为字节数组,反之亦然,但是当从字节数组返回到字符串时,它不会报告与最初给定的值相同的值。

这是在ideone上运行的最小示例

/* package whatever; // don't place package name! */

import java.util.*;
import java.lang.*;
import java.io.*;
import javax.xml.bind.DatatypeConverter;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Random;

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        byte[] b = new byte[20];
        new Random().nextBytes(b);

        String s = DatatypeConverter.printBase64Binary(b);
        byte[] newB = DatatypeConverter.parseBase64Binary(s);

        if(!Arrays.equals(b, newB))
            System.out.println(b + " should match " + newB);

        s = "Hello world";

        byte[] bytes = DatatypeConverter.parseBase64Binary(s);
        String newS = DatatypeConverter.printBase64Binary(bytes);
        byte[] newBytes = DatatypeConverter.parseBase64Binary(newS);

        if(!s.equals(newS))
            System.out.println(s + " should match " + newS);

        if(!Arrays.equals(bytes, newBytes))
            System.out.println(bytes + " should match " + newBytes);
    }
}

我希望不打印任何东西,如果陈述应该否定正面匹配因此不打印它输出:

  

Hello world应该与Hellowor匹配

我在我的机器上运行此问题时遇到了同样的问题,作为java 8中单元测试的一部分

奇怪的是当我将非匹配字符串转换回字节时,它们匹配

2 个答案:

答案 0 :(得分:4)

字符串不匹配,因为它们不应该。

操作printBase64Binary将任意字节流转换为可打印ASCII字符序列。但是,这个序列不会只包含任何旧的可打印ASCII字符集合 - 如果字符串是某个字节序列的有效Base64转换,那么你可以对它进行某些事情说明:除其他外,它赢了&#39 ; t包含空格,输出长度为4的倍数。

让我再次明确地说:并非所有字符串都是有效的Base64表示

操作parseBase64Binary将尽力将您提供的字符串解释为Base64字符串,并返回它来自的字节流。但是,如果你给它一些字符串,你只是凭空捏造,嗯,它会尽力解释它。

所以最终的结果是这个操作:

字节 - > printBase64Binary - >字符串 - > parseBase64Binary - >字节

是一个很好的往返操作,总会让你回到你开始使用的同一个数组,但是这个操作:

字符串 - > parseBase64Binary - > bytes - > printBase64Binary - >串

不会为大多数字符串返回原始字符串。 (就我个人而言,我认为它应该抛出一个异常,表明你输入了错误的输入,但我理解导致java人做不同事情的设计目标)

答案 1 :(得分:1)

我正在将字符串转换为字节数组并返回到我的项目中并使用String.getBytes(charset)new String(byteArray, 0, byteArray.length, charset)

在翻译过程中没有遇到任何问题。