【问题标题】:How to retrieve String from DatagramPacket [duplicate]如何从 DatagramPacket 中检索字符串 [重复]
【发布时间】:2012-04-26 22:24:01
【问题描述】:

下面的代码打印出来

[B@40545a60,[B@40545a60abc exp 

但我想打印abc,这样我就可以从接收系统中检索到正确的消息。

public class Operation {
InetAddress ip;
DatagramSocket dsock;
DatagramPacket pack1;
byte[] bin,bout;
WifyOperation(InetAddress Systemip)
{
    ip=Systemip;
    try {
        dsock=new DatagramSocket();

        } catch (SocketException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        }

}

void sendbyte()
{
    String senddata="abc"; 
    bout=senddata.getBytes();
    pack1=new DatagramPacket(bout,bout.length,ip,3322);
    try {
        dsock.send(pack1);
        Log.d(pack1.getData().toString(),"abc exp");
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
}

如何从数据包pack1 中检索字符串而不是字节?

【问题讨论】:

  • 您期望什么输出,为什么?
  • 我想检索我添加到 DatagramPacket 中的原始消息“abc”,我的问题是我无法检索字符串,而是获取它的二进制值

标签: java android udp bytearray


【解决方案1】:

基于评论的新答案:

确实,我的旧答案不正确。 更新:

String str = new String(
    pack1.getData(),
    pack1.getOffset(),
    pack1.getLength(),
    StandardCharsets.UTF_8 // or some other charset
);

旧答案:

执行以下操作:

byte[] data = pack1.getData();
InputStreamReader input = new InputStreamReader(
    new ByteArrayInputStream(data), Charset.forName("UTF-8"));

StringBuilder str = new StringBuilder();
for (int value; (value = input.read()) != -1; )
    str.append((char) value);

这假定字节数据代表(仅)UTF-8 文本,但情况可能并非如此。

【讨论】:

  • 这忽略了传输的长度,所以它会给你很多尾随的空值。它也是五六行代码。
【解决方案2】:

您可以尝试: String msg = new String(pack1.getData(), pack1.getOffset(), pack1.getLength());

【讨论】:

  • 完全正确,这是正确答案。
猜你喜欢
  • 2019-08-17
  • 1970-01-01
  • 2021-06-15
  • 2013-03-26
  • 1970-01-01
  • 2016-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多