【问题标题】:Array of bytes: how to know exactly numbers of byte received字节数组:如何准确知道接收到的字节数
【发布时间】:2013-01-07 18:25:16
【问题描述】:

我正在使用字节数组来存储从另一台计算机接收到的数据包。

receivedData = new byte[1024];
receivedPacket = new DatagramPacket(receivedData, receivedData.length);
socket.receive(receivedPacket);
receivedData = receivedPacket.getData();
String res = new String(receivedData);  // PROBLEM HERE

问题出在最后一行:因为我将 receivedData 声明为长度为 1024 的字节流。所以,最后一行总是会从整个数组中创建一个新字符串,尽管它不知道我到底有多少实际字节已收到。所以,我遇到了令人沮丧的错误:res 没有收到如我所愿。 (因为我收到的实际字节长度不能修复整个数组)

所以,我的问题是:我该如何解决这个问题,我怎么知道我真正收到了多少字节来转换为字符串?

【问题讨论】:

  • 最初我认为您可以将receivedPacket放入一个对象中,然后根据转换为byte []的对象的长度创建字节数组。之后创建字符串。

标签: java bytearray


【解决方案1】:

尝试使用DatagramPacket.getLength()

receivedData = new byte[1024];
receivedPacket = new DatagramPacket(receivedData, receivedData.length);
socket.receive(receivedPacket);
receivedData = receivedPacket.getData();
String charsetName = "US-ASCII"; // set to desired charset
String res = new String(receivedData, 0, receivedPacket.getLength(), charsetName);

编辑添加字符集。谢谢parsifal

【讨论】:

  • 请注意,这依赖于创建字符串时的默认编码,这可能是难以解决的错误的根源。
【解决方案2】:

javadocDatagramSocket.receive()

数据报包对象的长度字段包含 收到的消息

然后您可以使用带有字节数组和偏移量的构造函数来构造您的String

【讨论】:

    【解决方案3】:

    致电DatagramPacket.getLength() 了解实际收到了多少字节。

    当您从这些字节构造 String 时,一定要指定编码(实际上,您使用的是 JDK 默认编码,可能与服务器的编码不同) .

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-13
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      相关资源
      最近更新 更多