从二进制数据中检索字符串
Retrieve String from Binary Data
我正在 Java.My 中使用 UDP 组播,代码如下:
import java.io.*;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.lang.*;
import java.nio.charset.Charset;
public class MulticastTest {
static String MCAST_ADDR = "224.0.1.129";
static int DEST_PORT = 320;
static int BUFFER_LENGTH = 4096;
public static void main(String args[]) {
try {
byte[] b = new byte[BUFFER_LENGTH];
DatagramPacket dgram = new DatagramPacket(b, b.length);
MulticastSocket socket = new MulticastSocket(DEST_PORT);
socket.joinGroup(InetAddress.getByName(MCAST_ADDR));
socket.receive(dgram); // blocks until a datagram is received
System.err.println("Received " + dgram.getLength() + " bytes from " + dgram.getAddress());
dgram.setLength(b.length); // must reset length field!
String received = new String(dgram.getData());
System.out.println("Bytes received and printed at Console: " + received);
} catch (Exception e) {
}
}
}
我能够从另一个节点接收数据,但只能是二进制数据。
有人可以告诉我如何将变量 "received" 转换成有意义的东西,例如 Strings/Character 以便它可读 humans.And 你能写下吗代码完全正确,我是 programming.I 的新手,非常感谢任何帮助。
String received = new String(dgram.getData());
这是从其他节点获取接收到的数据的地方,它已经是String格式了。您遇到的问题是您正在从字节转换为字符串,并且由于您的缓冲区大小为 4096,因此您的字符串变量中包含空白字符。这将出现在变量中的实际数据之后。
你可以做些什么来让它变得更好 "readable to humans",就是通过一些字符串操作函数来传递它以删除空白字符。
这个想法是遍历您收到的字符串,并检索那里存在的所有字母数字字符。
希望对您有所帮助。
您可以使用它来提取数据
String received = new String(dgram.getData());
String dataReceived = "";
for(int i = 0;i<received.lenght();i++){
char charac = received.charAt(i);//this will allow you to get all data in String
switch(charac){
case 'a': dataReceived = dataReceived.concat(String.valueOf(charac));
case 'b': dataReceived = dataReceived.concat(String.valueOf(charac));
case 'c': dataReceived = dataReceived.concat(String.valueOf(charac));
case 'd': dataReceived = dataReceived.concat(String.valueOf(charac));
...
case '1': dataReceived = dataReceived.concat(String.valueOf(charac));
case '2': dataReceived = dataReceived.concat(String.valueOf(charac));
...
case '.': dataReceived = dataReceived.concat(String.valueOf(charac));
case ',': dataReceived = dataReceived.concat(String.valueOf(charac));
..
}
}
System.out.println("Data Received: "+dataReceived);
请注意,代码不完整,如果您的字符串仅包含字母,则无需检查数字和符号。
祝你好运!
我正在 Java.My 中使用 UDP 组播,代码如下:
import java.io.*;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.lang.*;
import java.nio.charset.Charset;
public class MulticastTest {
static String MCAST_ADDR = "224.0.1.129";
static int DEST_PORT = 320;
static int BUFFER_LENGTH = 4096;
public static void main(String args[]) {
try {
byte[] b = new byte[BUFFER_LENGTH];
DatagramPacket dgram = new DatagramPacket(b, b.length);
MulticastSocket socket = new MulticastSocket(DEST_PORT);
socket.joinGroup(InetAddress.getByName(MCAST_ADDR));
socket.receive(dgram); // blocks until a datagram is received
System.err.println("Received " + dgram.getLength() + " bytes from " + dgram.getAddress());
dgram.setLength(b.length); // must reset length field!
String received = new String(dgram.getData());
System.out.println("Bytes received and printed at Console: " + received);
} catch (Exception e) {
}
}
}
我能够从另一个节点接收数据,但只能是二进制数据。 有人可以告诉我如何将变量 "received" 转换成有意义的东西,例如 Strings/Character 以便它可读 humans.And 你能写下吗代码完全正确,我是 programming.I 的新手,非常感谢任何帮助。
String received = new String(dgram.getData());
这是从其他节点获取接收到的数据的地方,它已经是String格式了。您遇到的问题是您正在从字节转换为字符串,并且由于您的缓冲区大小为 4096,因此您的字符串变量中包含空白字符。这将出现在变量中的实际数据之后。
你可以做些什么来让它变得更好 "readable to humans",就是通过一些字符串操作函数来传递它以删除空白字符。 这个想法是遍历您收到的字符串,并检索那里存在的所有字母数字字符。
希望对您有所帮助。
您可以使用它来提取数据
String received = new String(dgram.getData());
String dataReceived = "";
for(int i = 0;i<received.lenght();i++){
char charac = received.charAt(i);//this will allow you to get all data in String
switch(charac){
case 'a': dataReceived = dataReceived.concat(String.valueOf(charac));
case 'b': dataReceived = dataReceived.concat(String.valueOf(charac));
case 'c': dataReceived = dataReceived.concat(String.valueOf(charac));
case 'd': dataReceived = dataReceived.concat(String.valueOf(charac));
...
case '1': dataReceived = dataReceived.concat(String.valueOf(charac));
case '2': dataReceived = dataReceived.concat(String.valueOf(charac));
...
case '.': dataReceived = dataReceived.concat(String.valueOf(charac));
case ',': dataReceived = dataReceived.concat(String.valueOf(charac));
..
}
}
System.out.println("Data Received: "+dataReceived);
请注意,代码不完整,如果您的字符串仅包含字母,则无需检查数字和符号。
祝你好运!