Android UDP 返回随机字符
Android UDP returning random characters
我试图制作一个通过 UDP 接收 F1 2020 遥测数据的应用程序。
出于某种原因,无论我如何尝试将接收到的字节转换为字符串,它都只是 returns 个随机字符。
我确定这是某个地方的菜鸟错误,但我就是想不通在哪里
这是接收和记录数据包的class:
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�������...
我以为是因为我记录的是字节而不是字符串,但我尝试了很多不同的方法来转换成字符串,结果总是这样。
For some reason, no matter how I try to turn the received bytes into a string, it just returns random characters.
当您执行 new String(bytes, ...)
时,您正在尝试将编码为字节的文本解码为 Unicode 字符...使用平台的默认字符集:
如果字节表示的数据是以不同字符集编码的文本,则字符将无法正确解码。您需要使用正确的字符集。
但是如果字节中的数据是二进制而不是文本,那么通过这种方式解码,你不太可能将它变成“随机字符”以外的任何东西,无论您使用什么字符集.
如果在 UDP 数据包中发送的数据是二进制的,这很常见。看来这里就是这种情况。
I'm sure its a noob mistake somewhere but I just can't figure out where
我认为你的错误是假设所有数据基本上都是文本。
当UDP数据包的格式有规范时,你应该从阅读开始。格式将决定您应如何解码数据包。
Google 搜索为我找到了这个:
如果没有规范,您将不得不逆向工程来自示例数据包的格式。这既乏味又 time-consuming,我们无法教你这样做。
我试图制作一个通过 UDP 接收 F1 2020 遥测数据的应用程序。
出于某种原因,无论我如何尝试将接收到的字节转换为字符串,它都只是 returns 个随机字符。
我确定这是某个地方的菜鸟错误,但我就是想不通在哪里
这是接收和记录数据包的class:
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�������...
我以为是因为我记录的是字节而不是字符串,但我尝试了很多不同的方法来转换成字符串,结果总是这样。
For some reason, no matter how I try to turn the received bytes into a string, it just returns random characters.
当您执行 new String(bytes, ...)
时,您正在尝试将编码为字节的文本解码为 Unicode 字符...使用平台的默认字符集:
如果字节表示的数据是以不同字符集编码的文本,则字符将无法正确解码。您需要使用正确的字符集。
但是如果字节中的数据是二进制而不是文本,那么通过这种方式解码,你不太可能将它变成“随机字符”以外的任何东西,无论您使用什么字符集.
如果在 UDP 数据包中发送的数据是二进制的,这很常见。看来这里就是这种情况。
I'm sure its a noob mistake somewhere but I just can't figure out where
我认为你的错误是假设所有数据基本上都是文本。
当UDP数据包的格式有规范时,你应该从阅读开始。格式将决定您应如何解码数据包。
Google 搜索为我找到了这个:
如果没有规范,您将不得不逆向工程来自示例数据包的格式。这既乏味又 time-consuming,我们无法教你这样做。