首页 > 解决方案 > Android UDP返回随机字符

问题描述

我试图制作一个通过 UDP 接收 F1 2020 遥测的应用程序。

出于某种原因,无论我如何尝试将接收到的字节转换为字符串,它都只会返回随机字符。

我确定这是某个地方的菜鸟错误,但我就是不知道在哪里

这是接收和记录数据包的类:

class ClientListen implements Runnable {
    private Thread t;

    public void run() {
        boolean run = true;
        try {
            DatagramSocket udpSocket = new DatagramSocket(20777);
            byte[] buffer = new byte[2048];
            DatagramPacket packet = new DatagramPacket(buffer, buffer.length);

            while (run) {
                udpSocket.receive(packet);
                String received = new String(packet.getData(), 0, packet.getLength());
                packet.setLength(buffer.length);
                Log.i("Received data", received);
                try{
                    Thread.sleep(50);

                } catch (InterruptedException e) {}
            }
            udpSocket.close();

        }catch (IOException e) {
            Log.e("UDP client has IOException", "error: ", e);
            run = false;
        }
    }

    public void start() {
        if (t == null) {
            t = new Thread();
            t.start();
        }
    }
}

当我单击应用程序上的按钮时线程开始,我可以看到它记录数据并在游戏暂停时停止,因为它应该

数据输出类似于I/Received data: �����R<�&lt;li�)C�������GndBƨS@3Z��N��9��y�}�Ժ�~��g�r��~�ө;��J�qӼ��?�RQ=�k�&lt;h���p�&lt;@84�C�������...

我认为这是因为我记录的是字节而不是字符串,但是我尝试了许多不同的方法来转换为字符串并且它总是有这个结果。

标签: javaandroidudp

解决方案


出于某种原因,无论我如何尝试将接收到的字节转换为字符串,它都只会返回随机字符。

当您new String(bytes, ...)尝试将编码为字节的文本解码为 Unicode 字符时……使用您平台的默认字符集:

  • 如果字节表示的数据是以不同字符集编码的文本,则字符将无法正确解码。您需要使用正确的字符集。

  • 但是,如果字节中的数据是二进制而不是文本,那么无论您使用什么字符集,都不太可能通过这种方式解码将其转换为“随机字符”以外的任何内容。

如果在 UDP 数据包中发送的数据是二进制的,这很常见。看起来就是这种情况。


我确定这是某个地方的菜鸟错误,但我就是不知道在哪里

我认为您的错误是假设所有数据基本上都是文本。

当有这些 UDP 数据包的格式规范时,您应该从阅读它开始。格式将决定您应该如何解码数据包。

谷歌搜索为我找到了这个:

如果没有规范,您将不得不对示例数据包的格式进行逆向工程。这既乏味又耗时,而且不是我们可以教你做的事情。


推荐阅读