Java - byte []到String然后再回到byte []

时间:2015-12-06 04:00:21

标签: java string bytearray

我必须将byte[]放入字符串中,然后将其转换回byte]

但是,当我这样做时,返回的byte[]与原始版本不同。

这是代码:

public class HelloWorld {            
  public static void main(String[] args) {        
    byte[] data = {
            (byte) 0xde, (byte) 0x33, (byte) 0x10, (byte) 0x12,
            (byte) 0xde, (byte) 0x33, (byte) 0x10, (byte) 0x12,
        };

    System.out.println("OriginalDataByte : " + data);

    String datastring = data.toString();

    System.out.println("StringFromByteArray : " + datastring);

    byte[] newdata = datastring.getBytes();

    System.out.println("ByteArrayFromString: " + newdata);                        
  }
}

回归:

OriginalDataByte : [B@6d06d69c
StringFromByteArray : [B@6d06d69c
ByteArrayFromString: [B@7852e922

有什么方法可以解决这个问题吗?

3 个答案:

答案 0 :(得分:2)

您正在原始数组引用中调用toString(),它正在打印引用的哈希码以及类型。

您应该使用String(byte[])构造函数从字节数组创建String。而不是data.toString()

String datastring = new String(data);
System.out.println("StringFromByteArray : " + datastring);

字符串中的getBytes()会返回一个新的byte[],字符串的内容为字节。

byte[] newdata = datastring.getBytes();

因此newDatadata将引用两个不同的对象。在java原始数组中是对象。

答案 1 :(得分:1)

toBtring of Byte Array用法对象的toString方法并返回getClass().getName() + "@" + Integer.toHexString(hashCode())

这永远不会转换回原始的字节数组数据。以下代码是正确的bay转换为字符串并返回字节数组。

public class HelloWorld {

    public static void main(String[] args) throws UnsupportedEncodingException {

        byte[] data = {
            (byte) 0xde, (byte) 0x33, (byte) 0x10, (byte) 0x12,
            (byte) 0xde, (byte) 0x33, (byte) 0x10, (byte) 0x12,};

        System.out.println("OriginalDataByte : " + data);
        System.out.println("OriginalDataByte string: " + new String(data));

        String datastring = new String(data);

        System.out.println("StringFromByteArray : " + datastring);

        byte[] newdata = datastring.getBytes();

        System.out.println("ByteArrayFromString: " + new String(newdata));
    }
}

答案 2 :(得分:0)

当您将byte[]转换为String时,您隐式解码它从某些字符集+字符编码方案转换为(实际上)UTF-16。当您将Stringbyte[]进行对话时,您将从UTF-16隐式编码到上述编码中。

问题是,如果您在进行转换时未指定Charset(或字符集名称),则会获得平台的默认 Charset。这是一个问题,因为大多数字符集不允许您将任意字节序列转换为字符串并再次返回而不会丢失数据。

  

有什么方法可以解决这个问题吗?

LATIN-1字符编码确实将所有256个字节映射到唯一的Unicode代码点,并且解码/编码序列是无损的。因此,一种解决方案是在转换中使用"LATIN-1"作为字符集名称。

然而,在我看来,你在这里所做的事情在概念上是错误的。 String类用于保存字符序列 ...而不是任意二进制数据。