【问题标题】:Converting byte array with ASCII encoding to String produces weird result将具有 ASCII 编码的字节数组转换为字符串会产生奇怪的结果
【发布时间】:2018-10-14 04:12:59
【问题描述】:

我正在用 Java 制作一个套接字应用程序,它以 ASCII 格式从服务器接收一些 HTML 数据,然后相应地解析数据。

byte[] receivedContent = new byte[12500];
receivedSize = inputStream.read(receivedContent);
receivedContent = Arrays.copyOf(receivedContent, receivedSize+1);
if (receivedSize == -1) {
  System.out.println("ERROR! NO DATA RECEIVED");
  System.exit(-1);
}
lastReceived = new String(receivedContent, StandardCharsets.US_ASCII);

这应该非常简单,但事实并非如此。我打印了一些调试消息,发现尽管接收到一些字节的数据,(例如 priting receivedSize 告诉我它收到了 784 个字节),这些字节的结果字符串只有几个字符长,如下所示:

Ard</a></li><li><a

我期待一个完整的 HTML 文档,所以这显然是错误的。关于何时会发生这种情况也没有明显的模式。这似乎完全随机。由于我正在为缓冲区分配新内存,因此其中不应该有任何旧数据与来自套接字的新数据相混淆。有人可以对这种奇怪的行为有所了解吗?此外,这似乎在我运行 OracleJDK 的 Windows 机器上发生的频率较低,而不是在运行 OpenJDK 的远程 Ubunut 机器上,这可能是原因吗?我将如何解决这个问题?

更新: 最后,我根据 ASCII 表手动检查了字节数组的 ASCII 编码,发现服务器故意发送乱码数据。谜团解开了。

【问题讨论】:

  • 你检查了 receivedSize 的值吗?
  • @kishore 我做到了。我打印了解码后的字符串以及接收到的大小,但发现不一致。

标签: java sockets


【解决方案1】:

而不是使用:

 inputStream.read(receivedContent);

您需要从流中读取所有数据。使用类似的东西(来自 apache commons io):

 IOUtils.readFully(inputStream, receivedContent)

【讨论】:

  • 但是为什么它告诉我它收到了 784 字节但字符串明显小于 784 字节?
猜你喜欢
  • 2019-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-14
  • 2011-10-15
  • 1970-01-01
  • 2014-07-05
  • 1970-01-01
相关资源
最近更新 更多