从二进制数据中检索字符串

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);

请注意,代码不完整,如果您的字符串仅包含字母,则无需检查数字和符号。

祝你好运!