java - 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<�<li�)C�������GndBƨS@3Z��N��9��y�}�Ժ�~��g�r��~�ө;��J�qӼ��?�RQ=�k�<h���p�<@84�C�������...
我认为这是因为我记录的是字节而不是字符串,但是我尝试了许多不同的方法来转换为字符串并且它总是有这个结果。
解决方案
出于某种原因,无论我如何尝试将接收到的字节转换为字符串,它都只会返回随机字符。
当您new String(bytes, ...)
尝试将编码为字节的文本解码为 Unicode 字符时……使用您平台的默认字符集:
如果字节表示的数据是以不同字符集编码的文本,则字符将无法正确解码。您需要使用正确的字符集。
但是,如果字节中的数据是二进制而不是文本,那么无论您使用什么字符集,都不太可能通过这种方式解码将其转换为“随机字符”以外的任何内容。
如果在 UDP 数据包中发送的数据是二进制的,这很常见。看起来就是这种情况。
我确定这是某个地方的菜鸟错误,但我就是不知道在哪里
我认为您的错误是假设所有数据基本上都是文本。
当有这些 UDP 数据包的格式规范时,您应该从阅读它开始。格式将决定您应该如何解码数据包。
谷歌搜索为我找到了这个:
如果没有规范,您将不得不对示例数据包的格式进行逆向工程。这既乏味又耗时,而且不是我们可以教你做的事情。
推荐阅读
- linux - 如何将脏 fastq 文件排序为交错的 fastq
- c# - 在单独的线程中同步更新属性
- php - Uniswap:如何使用 API 读取代币价格
- c# - DSharpPlus - 现有消息的 WaitForReaction
- php - PHP 页面未加载(PHP 联系表)
- git - 如何在 git 中将 2 个拉取请求从一个分支合并到另一个分支
- reactjs - 异步笑话测试中的 TSServer 误报
- mysql - mysql 在列中插入值:int DEFAULT 0 导致错误
- android - 如何在应用程序中有条件地选择模块依赖或源代码?
- c# - 使用 XPath 获取子元素值,其中日期是元素值