Java 无法从字符串中获取原始字节数组

Java 无法从字符串中获取原始字节数组,java,Java,我有一个字节数组,并使用新的Stringarray从中创建字符串。当我使用.getBytes将其转换回字节数组时,它不会返回原始字节数组。有什么好处 String text = "two hats"; boolean t1 = Arrays.equals(text.getBytes(), text); // true byte[] barray = {(byte)0x8f, (byte)0xd5, (byte)0xaf, (byte)0x30, (byte)0xb9}; St

我有一个字节数组,并使用新的Stringarray从中创建字符串。当我使用.getBytes将其转换回字节数组时,它不会返回原始字节数组。有什么好处

String text = "two hats";
boolean t1 = Arrays.equals(text.getBytes(), text); // true

byte[] barray = {(byte)0x8f, (byte)0xd5, (byte)0xaf, (byte)0x30, (byte)0xb9};        

String test1 = new String(barray); 
boolean t2 = Arrays.equals(barray.getBytes(), test1); // false

// I tried setting an encoding but that didn't help.

Charset cs = Charset.forName("UTF-8"); 
String test2 = new String(barray, cs);       
boolean t3 = Arrays.equals(barray, test2, cs); // false
这是我实际使用的代码

// test byte array vs string
public static void testEqual(byte[] bytes, String str) {
    byte[] fromString = str.getBytes();        

    printBytes(bytes);        
    printBytes(fromString);        
    System.out.println(Arrays.equals(bytes, fromString));        
}

// test byte array vs string, with charset
public static void testEqual(byte[] bytes, String str, Charset charset) {
    byte[] fromString = str.getBytes(charset);        

    printBytes(bytes);        
    printBytes(fromString);        
    System.out.println(Arrays.equals(bytes, fromString));
}

// prints bytes as hex string
public static void printBytes(byte[] bytes) {
    for (byte b: bytes) {
        System.out.print(String.format("%02X ", b));
    }        
    System.out.println();
}

public static void main(String[] args) {
    String text = "two hats";
    testEqual(text.getBytes(), text); // works fine

    byte[] barray = {(byte)0x8f, (byte)0xd5, (byte)0xaf, (byte)0x30, (byte)0xb9};        

    String test1 = new String(barray); // breaks      
    testEqual(barray, test1);

    Charset cs = Charset.forName("UTF-8"); // breaks too
    String test2 = new String(barray, cs);       
    testEqual(barray, test2, cs);
}
演示:


PS:我不想使用Base64或类似的东西,您似乎试图通过使用平台默认编码将任意二进制数据转换为字符串来存储它。不要那样做。使用base64或hex将任意二进制数据表示为文本。base64转换有很多类;我喜欢

如果数据确实是某个文本的二进制编码形式,则应明确指定该编码-但这仅适用于原始数据是文本的情况。使用平台默认编码几乎总是一个坏主意


二进制数据和文本数据非常不同。将不透明的二进制数据任意转换为字符串就像希望能够将任意文件加载到图像编辑器中,并看到有用的内容。

您似乎试图通过使用平台默认编码将其转换为字符串来存储任意二进制数据。不要那样做。使用base64或hex将任意二进制数据表示为文本。base64转换有很多类;我喜欢

如果数据确实是某个文本的二进制编码形式,则应明确指定该编码-但这仅适用于原始数据是文本的情况。使用平台默认编码几乎总是一个坏主意


二进制数据和文本数据非常不同。将不透明的二进制数据任意转换为字符串就像希望能够将任意文件加载到图像编辑器中,并看到有用的东西一样。

为什么会出现这个问题?我希望字符串本质上是一个字节数组。@quantumSoup:事实并非如此。它们是字符序列。它们是文本数据。如果您想将二进制数据表示为文本,则需要执行适当的转换。我最初反对将其编码为文本,因为它总是会产生一些开销。33%与base64相似似乎太过分了。@QuantumsSoup:好吧,这基本上是以文本形式传输任意二进制数据时必须付出的代价,除非你想痛苦地计算出256个字符的字母表,你肯定知道你的传输通道能够处理。然后您必须编写适当的编码/解码。Base64基本上是这样做的标准方式。为什么这是一个问题?我希望字符串本质上是一个字节数组。@quantumSoup:事实并非如此。它们是字符序列。它们是文本数据。如果您想将二进制数据表示为文本,则需要执行适当的转换。我最初反对将其编码为文本,因为它总是会产生一些开销。33%与base64相似似乎太过分了。@QuantumsSoup:好吧,这基本上是以文本形式传输任意二进制数据时必须付出的代价,除非你想痛苦地计算出256个字符的字母表,你肯定知道你的传输通道能够处理。然后您必须编写适当的编码/解码。Base64基本上是实现这一点的标准方法。