【问题标题】:Java - byte[] to String and then back to byte[] [closed]Java - 字节 [] 到字符串,然后返回字节 [] [关闭]
【发布时间】:2015-12-06 04:00:21
【问题描述】:

我必须将 byte[] 放入 string ,然后将其转换回 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

有什么办法解决这个问题?

【问题讨论】:

  • 您的问题标题不正确。在 Java 中,Byte[]byte[] 是不同的东西。你真的在问byte[]Byte[] 吗?您的问题中还有许多其他困惑。但它>>看起来toString()为数组打印的内容。
  • 请不要破坏您的问题,即使事实证明您犯了错误。我已恢复您的编辑。

标签: java string bytearray


【解决方案1】:

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

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

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

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

byte[] newdata = datastring.getBytes();

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

【讨论】:

【解决方案2】:

字节数组的toString使用对象的toString方法并返回getClass().getName() + "@" + Integer.toHexString(hashCode())

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

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

【讨论】:

【解决方案3】:

当您将 byte[] 转换为 String 时,您正在将其从某些字符集 + 字符编码方案隐式解码为(实际上)UTF-16。当您将Stringbyte[] 协调时,您正在从UTF-16 隐式编码 到上述编码。

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

有什么办法解决这个问题?

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

但是,在我看来,您在这里所做的在概念上是错误的。 String 类旨在保存 字符 的序列......而不是任意二进制数据。

【讨论】:

  • 我尝试使用: String datastring = new String(data , "UTF-8");和 data.getBytes("UTF-8") ..但它不识别字符集类型
  • “不识别字符集类型”是什么意思?你给了它一个String而不是Charset。此外,使用 UTF-8 不太可能工作......除非字节数组包含真正的 UTF-8 编码文本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-07
  • 2011-12-17
  • 2014-07-04
  • 1970-01-01
  • 2013-12-05
相关资源
最近更新 更多