Java-字节[]到字符串到字节[]的转换错误

Java-字节[]到字符串到字节[]的转换错误,java,string,byte,Java,String,Byte,尝试从byte[]类型的数组构造字符串,然后使用String.getBytes()将其转换回byte[]数组时,会修改某些字节值。下面是复制我的问题的一段代码: public static void main(String[] args) { byte[] arr = new byte[] { (byte)0xff, 0x5e}; String str = new String(arr); byte[] arr2 = str.getBytes(); for(int

尝试从byte[]类型的数组构造字符串,然后使用String.getBytes()将其转换回byte[]数组时,会修改某些字节值。下面是复制我的问题的一段代码:

public static void main(String[] args)
{
    byte[] arr = new byte[] { (byte)0xff, 0x5e};
    String str = new String(arr);
    byte[] arr2 = str.getBytes();
    for(int i = 0; i < 2; i++)
        System.out.print(String.format("%02X ", arr2[i]));
    for(int i = 0; i < 2; i++)
        System.out.print(String.format("%02X ", arr[i]));
}
我尝试了所有标准字符集的转换,但结果是一样的。出于我无法理解的原因,0xFF变成了0x3F。。。
为什么,我该如何纠正这一点?

在给出了一些有用的答案后,下面是我如何让它发挥作用的:

public static void main(String[] args)
{
    byte[] arr = new byte[] { (byte)0xff, 0x5e};
    String str = new String(arr, Charset.forName("ISO-8859-1"));
    byte[] arr2 = str.getBytes(Charset.forName("ISO-8859-1"));
    for(int i = 0; i < 2; i++)
        System.out.print(String.format("%02X ", arr2[i]));
    for(int i = 0; i < 2; i++)
        System.out.print(String.format("%02X ", arr[i]));
}
publicstaticvoidmain(字符串[]args)
{
字节[]arr=新字节[]{(字节)0xff,0x5e};
String str=新字符串(arr,Charset.forName(“ISO-8859-1”);
byte[]arr2=str.getBytes(Charset.forName(“ISO-8859-1”);
对于(int i=0;i<2;i++)
系统输出打印(字符串格式(“%02X”,arr2[i]);
对于(int i=0;i<2;i++)
系统输出打印(字符串格式(“%02X”,arr[i]);
}

上面使用的字符集允许我使用任何值的字节,而无需进行转换,这对于处理二进制数据非常有用。

无法重现该问题。此代码取决于JVM的默认字符集编码。这就是为什么我们不使用默认编码,而是在使用
getBytes()
new String()
时指定它。1字节编码,如
ISO-8859-1
,应该可以正常工作。平台默认值为UTF-8时,您可以看到问题,但使用例如
新字符串(arr,“ISO-8859-1”)转换正常。将“ISO-8859-1”传递给getBytes解决了问题。谢谢你,米克!如果您使用的是二进制数据,则不会将字节转换为字符。字符用于文本数据。
public static void main(String[] args)
{
    byte[] arr = new byte[] { (byte)0xff, 0x5e};
    String str = new String(arr, Charset.forName("ISO-8859-1"));
    byte[] arr2 = str.getBytes(Charset.forName("ISO-8859-1"));
    for(int i = 0; i < 2; i++)
        System.out.print(String.format("%02X ", arr2[i]));
    for(int i = 0; i < 2; i++)
        System.out.print(String.format("%02X ", arr[i]));
}