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

标签 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);
    }
}

我希望不会打印任何内容,两个 if 语句都应该否定正匹配,因此还没有打印它输出:

Hello world should match Hellowor

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

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

最佳答案

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

操作printBase64Binary将任意字节流转换为可打印的ASCII字符序列。然而,这个序列不仅仅包含任何旧的可打印 ASCII 字符集合 - 如果一个字符串是某个字节序列的有效 Base64 转换,那么您可以对它说一些话:除其他外,它不会包含空格输出长度将为4的倍数。

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

操作parseBase64Binary将尽力将您提供的字符串解释为Base64字符串,并返回它来自的字节流。然而,如果你给它一些你凭空编造的字符串,那么它会尽力解释它。

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

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

是一个很好的往返操作,它总是会返回与开始时相同的数组,但是此操作:

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

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

关于使用 DatatypeConverter 时,Java 字节数组不会转换回其原始字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30707959/

相关文章:

java - 复制/粘贴在签名的小程序中不起作用

java - 性能:从 HashMap.values() 创建一个 ArrayList

c - 根据长度崩溃对静态数组中的字符串进行排序? |错误分配/访问|

java - java中字节数组的初始化

java - 创建 TessBaseAPI 时出现 UnsatisfiedLinkError : no jnilept in java. library.path

java - 使一个 token 优先于另一个 token

c++ - char 数组的最大大小?

c - 从 C 中的结构成员字符数组打印字符数组时,fopen 数据损坏

java - 字节 [] 到字符 []

android - 可视化工具 onFftDataCapture - byte[] 索引是否代表频率?