2016-03-09 163 views
-1

检索字符串我与UDP组播工作在Java.My代码如下:从二进制数据

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”转换为有意义的字符串/字符,以便它可以被人读取。您能否准确地编写代码,我对编程真的很陌生。非常感谢任何帮助。

回答

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

这是从其他节点接收到的数据的位置,它已经是字符串格式。您遇到的问题是您要从字节转换为字符串,并且由于您的缓冲区大小为4096,因此您的字符串变量中有空白字符。这将显示在变量中的实际数据之后。

你可以做些什么让它更“对人类可读”,就是通过一些字符串操作函数来传递它以删除空白字符。 这个想法是通过你收到的字符串,并检索出现在那里的所有字母数字字符。

希望这会有所帮助。

您可以使用它来提取数据

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

注意,代码是不完整的,如果你的字符串将只包含字母无需检查数字和符号。

GoodLuck!

+0

我希望我在编程方面有先进性,能够完全符合您对我的要求。 有没有一些代码可以做到这一点,因为这需要我很长时间才能做到。 –

+0

简单来说,你定义的字节变量是4096的大小,非常大,现在如果你打算放入一些数据的话,它应该小于4096来适应。 Nows the fun part,如果你在4096缓冲区中说1000个数据大小,则有3096个可用空间。 当您将其转换为字符串时,这些可用空间将转换为字符串格式的空白字符。 例如,如果缓冲区包含字符串格式的“H,e,l,l,o”的数据,它将显示为“Hello **********”,其中*是可用空间左边,那是空白字符。 我会在下面提供一个代码供您使用。 – NaxiProg