【问题标题】:Core Java How to convert 20 byte byte array to a string核心Java如何将20字节字节数组转换为字符串
【发布时间】:2015-12-25 22:55:15
【问题描述】:

我得到输入 20 字节。使用的字符集是 UTF-8

当我将其转换为字符串时,我看到 0000000000000000000000000000000000000000

这是正确的。

但是当我将它转换为字符串时,我得到一个空值。我怀疑字符集有问题,但即使尝试了不同的字符集,我也无法返回值“0”。

public String convertFromBytes(byte[] input) {
    System.out.println("BYTES ARE =="+ Hex.encodeHexString(input));
    System.out.println("VALUE IS "+ new String(input, this.charset));
    return new String(input, this.charset);
}

我尝试更改 charSet 但无法解决它,任何我可能遗漏的线索。

US-ASCII
ISO-8859-1
UTF-8 UTF-16BE UTF-16LE UTF-16

【问题讨论】:

  • "但是当我将它转换为字符串时,我得到一个空值。" - 不,你几乎肯定会得到二十次 U+0000。如果每个字节的值为 0,那是正确的结果。我不清楚你为什么期望得到其他任何东西 - 请注意,在我知道的任何编码中,字符“0”not被编码为字节 0。
  • 是的,我现在有 20 个空格。你说的对。
  • 嗯 U+0000 不是空格,但那是另一回事...

标签: java encoding utf-8 character-encoding


【解决方案1】:

我没有测试过代码。

我了解,您尝试将 {0x00, 0x00, 0x00...} 转换为 "000...",但您什么也得不到。由于'0' 的值不是0 而是(ASCII)48,因此不会打印任何内容。转储十六进制值和将十六进制数组解释为带编码的字符串之间是有区别的。

尝试使用{48, 48, 48...},字符串将是"000000..",但十六进制写入行将产生"48484848...",或类似的东西。

PS:'0' 的代码是 48以 10 为底

编辑:看来你的字符串不是空的,只是包含不可打印的字符。

【讨论】:

  • 既然输入的值是{0x00, 0x00, 0x00...20次},我应该把'0'返回到调用这个方法的地方。知道如何实现这一目标。
  • @user2604052:为什么你应该返回“0”?如果您打算将其视为编码文本并对其进行解码,那将是一个非常奇怪的结果。
  • 如果 48 是 '0' 的代码,如果不是全部编码的话。你得到一个空值,因为在内存中字符串“0”看起来像0x30 0x00,十六进制代码表示“0”,以及终止的 NULL 字符。您尝试对一系列终止空值进行编码。解决方法是检查字符串是否为空,然后返回“0”。
  • @JonSkeet 考虑一种情况,我有一张地图,此方法的返回值是地图的值。在这种情况下,我应该正确返回 0,我不能将 key= x 和 value = 20 个空格放在地图右侧。
  • @PnDChameleon:OP 实际上没有空字符串。它们有一个由 U+0000 组成的字符串二十次。这不是一回事 - Java 字符串不是以空值结尾的,所以它只是 Unicode NULL 字符......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-06
  • 2013-12-19
  • 2011-07-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多