2016-03-09 3 views
-1

я работаю с UDP Multicast в 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) { 
     } 
    } 
} 

Я могу получить данные от другого узла, но только в виде двоичных данных. Может ли кто-нибудь рассказать мне, как преобразовать переменную «полученный» в нечто значимое, такое как «Строки/Символ», чтобы оно было читаемым для людей. И не могли бы вы написать код точно, я действительно новичок в программировании. действительно ценят любую помощь.

ответ

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

Здесь вы можете получить полученные данные с другого узла и уже в формате String. Проблема, с которой вы сталкиваетесь, заключается в том, что вы конвертируете из байта в String, и поскольку ваш буфер имеет размер 4096, ваша переменная 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); 

Обратите внимание, что код является неполной, если ваша строка будет содержать только буквы нет необходимости для проверки цифр и символов.

GoodLuck!

+0

Мне жаль, что я не продвинулся в программировании, чтобы точно указать, что вы мне сказали. Есть ли какой-то код для этого, потому что для этого понадобится возраст. –

+0

Проще говоря, переменная байта, которую вы определили, имеет размер 4096, это очень большой, теперь, если вы собираетесь вставить в нее некоторые данные, оно должно быть меньше 4096. Дает веселье, если вы указали, что 1000 размер данных в буфере 4096, есть 3096 свободного места. И когда вы конвертируете его в строку, эти свободные пробелы преобразуются в пустые символы в формате String. Например, если буфер содержит данные для «H, e, l, l, o», в строковом формате он будет отображаться как «Hello **********», где * - свободное пространство left, то есть пустые символы. Я дам вам код, который вы можете использовать. – NaxiProg

Смежные вопросы