Java 使用 DatatypeConverter 时,字节数组不会转换回其原始字符串
Java byte array doesn't convert back to its original string when using DatatypeConverter
我正在使用 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
单元测试的一部分,我的机器上遇到了同样的问题 运行
奇怪的是,当我将不匹配的字符串转换回字节时,它们确实匹配
我正在将字符串转换为字节数组并返回到我的项目中并使用 String.getBytes(charset)
和 new String(byteArray, 0, byteArray.length, charset)
.
翻译过程中没有遇到任何问题。
字符串不匹配,因为它们不应该匹配。
操作printBase64Binary
将任意字节流转换为可打印的ASCII字符序列。然而,这个序列不会只包含任何旧的可打印 ASCII 字符集合——如果一个字符串是某个字节序列的有效 Base64 转换,那么你可以说一些关于它的事情:除其他外,它不会包含空格并且输出长度将是 4 的倍数。
让我再次明确说明:并非所有字符串都是有效的 Base64 表示。
操作parseBase64Binary
会尽力将你给它的字符串解释为Base64字符串,并返回它来自的字节流。然而,如果你给它一些你凭空编造的字符串,那么,它会尽力解释它。
所以最后的结果就是这个操作:
字节 -> printBase64Binary
-> 字符串 -> parseBase64Binary
-> 字节
是一个很好的往返操作,它总是会返回你开始时使用的相同数组,但是这个操作:
字符串 -> parseBase64Binary
-> 字节 -> printBase64Binary
-> 字符串
不会将大多数字符串的原始字符串还给您。 (就个人而言,我认为它应该抛出一个异常来表明你给它提供了格式错误的输入,但我理解导致 java 人做一些不同的事情的设计目标)
我正在使用 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
单元测试的一部分,我的机器上遇到了同样的问题 运行奇怪的是,当我将不匹配的字符串转换回字节时,它们确实匹配
我正在将字符串转换为字节数组并返回到我的项目中并使用 String.getBytes(charset)
和 new String(byteArray, 0, byteArray.length, charset)
.
翻译过程中没有遇到任何问题。
字符串不匹配,因为它们不应该匹配。
操作printBase64Binary
将任意字节流转换为可打印的ASCII字符序列。然而,这个序列不会只包含任何旧的可打印 ASCII 字符集合——如果一个字符串是某个字节序列的有效 Base64 转换,那么你可以说一些关于它的事情:除其他外,它不会包含空格并且输出长度将是 4 的倍数。
让我再次明确说明:并非所有字符串都是有效的 Base64 表示。
操作parseBase64Binary
会尽力将你给它的字符串解释为Base64字符串,并返回它来自的字节流。然而,如果你给它一些你凭空编造的字符串,那么,它会尽力解释它。
所以最后的结果就是这个操作:
字节 -> printBase64Binary
-> 字符串 -> parseBase64Binary
-> 字节
是一个很好的往返操作,它总是会返回你开始时使用的相同数组,但是这个操作:
字符串 -> parseBase64Binary
-> 字节 -> printBase64Binary
-> 字符串
不会将大多数字符串的原始字符串还给您。 (就个人而言,我认为它应该抛出一个异常来表明你给它提供了格式错误的输入,但我理解导致 java 人做一些不同的事情的设计目标)