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

时间:2016-03-09 12:07:40

标签: java udp byte

我在Java中使用UDP Multicast。我的代码如下:

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) {
        }
    }
}

我能够从另一个节点接收数据,但只能作为二进制数据。 有人可以告诉我如何转换变量"收到"进入一些有意义的东西,比如字符串/字符,这样它就可以被人类阅读了。你能否准确地编写代码,我真的很喜欢编程。我真的很感激任何帮助。

1 个答案:

答案 0 :(得分:0)

 String received = new String(dgram.getData());

这是从其他节点获取接收数据的地方,它已经是String格式。您遇到的问题是您正在从字节转换为字符串,并且由于您的缓冲区大小为4096,因此您的String变量中包含空白字符。这将出现在变量中的实际数据之后。

你可以做些什么来让人类更容易阅读",是通过一些字符串操作函数传递它来删除空白字符。 我们的想法是浏览你收到的String,并检索那里的所有字母数字字符。

希望这有帮助。

您可以使用它来提取数据

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

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

好运!