2016-03-09 511 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