【问题标题】:Interpret Java byte[] as a String将 Java byte[] 解释为字符串
【发布时间】:2013-05-26 16:05:32
【问题描述】:

我有一个字节数组 b:

b = [-98, -99]

我需要将这段数据传递给一个函数。该函数接受一个字符串(这是不可更改的)。如何让 Java 将 b 中的原始二进制数据解释为字符串而不更改 b 中的任何位

编辑

这不是重复:

Converting byte array to String (Java)

因为,数组 b 由 [1001 1110 1001 1101] 或 [9E9D] 位组成。如果我使用

String str = new String(b, "Cp1252")

Cp1252 编码没有位 1001 1101 或 9D 的序列值。所以这个函数导致 str = "ž?"。二进制形式是 [1001 1110 0011 1111] 或 [9E3F]。请注意,该函数更改了我的位,这实际上破坏了我的数据。

我认为这将在 C++ 中使用重新解释转换来完成,但在 java 中不存在这样的东西。提前致谢。

【问题讨论】:

  • 字节的编码是什么?在您知道各个字节的含义之前,您无法将字节流解释为字符串。
  • new String(b, Charset.forName("cp1252")) ?
  • 你希望 [-98, -99, -100, -102, -104] 变成什么字符?
  • @Patashu 他们的 8 位十六进制等效项。 -98 是 FFFF FFFF FFFF FF9E。它存储在一个字节数组中(每个数组元素 8 位),所以它的十六进制等效值应该是 9E。通过类似的逻辑 [-98, -99, -100, -102, -104] 应该是 [9E, 9D, 9C, 9A, 98]。
  • @JHowlX 我的意思是,所有这些字符都不能用 ASCII 表示。那么你期望什么编码/你期望打印什么字符?

标签: java encoding type-conversion


【解决方案1】:

您可能想要new String(b, "charset")); 之类的东西,其中charset 替换为您要使用的编码。我建议UTF-8,除非您的值不是有效的 UTF-8。

【讨论】:

    【解决方案2】:

    您不能对任何值的任意字节执行此操作,因为没有允许这样做的编码,并且我假设您无法控制数据的解码。如果您确实可以控制解码和编码,则可以编写自己的 Charset,以便将数据映射到普通 Java 字符串(编码为 UTF- 16.对其进行编码:

    String str = new String(byteBuffer, MyCharSet);
    

    解码:

    byte[] byteBuffer = str.getBytes(MyCharSet);
    

    【讨论】:

      猜你喜欢
      • 2014-03-23
      • 2015-09-04
      • 2019-05-18
      • 2020-12-15
      • 2015-09-04
      • 1970-01-01
      • 1970-01-01
      • 2017-12-24
      • 2020-09-14
      相关资源
      最近更新 更多