2014-11-14 2 views
1

У меня есть массив байтов с именем byteArr[]. Мне нужно удалить первые 4 байта из него. Мой код показан ниже. Здесь я использую массив байтов для хранения входной строки. Я получил некоторый нежелательный байт с выходом i.e первые четыре байта не нужны с пятого числа, это правильно. Моя программа должна взять id из уважаемого тега rfid с помощью rfid-машины.Как удалить первые 4 байта из массива байтов в Java?

public class Serverc { 

    final protected static char[] hexArray = "ABCDEF".toCharArray(); 

    public static String bytesToHex(byte[] bytes) { 
     char[] hexChars = new char[bytes.length * 2]; 

     for (int j = 0; j < bytes.length; j++) { 
      int v = bytes[j] & 0xFF; 
      hexChars[j * 2] = hexArray[v >>> 4]; 
      hexChars[j * 2 + 1] = hexArray[v & 0x0F]; 
     } 
     return new String(hexChars); 
    } 

    public static void connection() throws IOException { 

     ServerSocket ss = new ServerSocket(9888);//exce 
     ss.setSoTimeout(300000000);//exce 
     System.out.println("Waiting for client on port " + ss.getLocalPort() + "..."); 

     while (true) { 

      Socket server = ss.accept();//exce 
      System.out.println("Just connected to " + server.getRemoteSocketAddress()); 

      int available = 0; 
      DataInputStream in = new DataInputStream(server.getInputStream());//exce 
      int input = 0; 
      //BufferedReader br = new BufferedReader(in); 
      byte byteArr[] = new byte[28]; 

      try { 
       //read till the end of stream 
       //while((input = in.available()) != -1) 
       while ((input = in.read(byteArr)) != -1) { 
        System.out.println("Size read is " + input); 
        System.out.println("Data is " + bytesToHex(byteArr)); 
       } 

       //System.out.println("inside finally"); 
       server.close();//exce 
       //System.out.println("outside finally"); 
      } catch (SocketTimeoutException ex) { 
       System.out.println("Socket timed out!"); 
      } 

      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 

       e.printStackTrace(); 
      } 
     } 
    } 

    public static void main(String args[]) throws IOException { 
     Serverc obj = new Serverc(); 
     obj.connection(); 
    } 
} 

Вот моя консоль

Waiting for client on port 9888... 
Just connected to /106.208.71.50:61532 
Size read is 28 
Data is 55000016910001DB00FB63ABEEAFC1EC888F10263410050711148F3500000000 
Size read is 28 
Data is 55000016910001DB00FB63ABEEAFC1EC888F10263410050711148F3500000000 
Size read is 28 
Data is 55000016910001DB00FB63ABEEAFC1EC888F10263410050711148F3500000000 
Size read is 28 
Data is 55000016910001DB00FB63ABEEAFC1EC888F10263410050711148F3500000000 
Size read is 28 
Data is 55000016910001DB00FB63ABEEAFC1EC888F10263410050711148F3500000000 

Здесь мне нужно удалить 55000016 от выхода. Заранее спасибо

+0

если массив не массивный, просто преобразовать его в список, а затем удалить элементы один за другим (список будет смещаться массивами) –

+0

на основе чтения тегов мой массив может стать massive.because в моем приложении необходимо было прочитать много тегов – Miller

ответ

2

Если вы хотите, чтобы пропустить первые четыре байта изменить это,

for (int j = 0; j < bytes.length; j++) { 

к чему-то вроде

for (int j = 4; j < bytes.length; j++) { 

Или вы могли бы использовать String.substring(int)

bytesToHex(byteArr).substring(8); // <-- skip the first 4 bytes 
0

Это вам лучше пропустить 4 байта. Но если вы хотите удалить их, вы должны использовать это решение (ваш массив может стать массивным). Этот алгоритм лучше всего вы можете получить в Java для своей проблемы. O (1), O (n) времени.

void removeFourBytes(byte[] a) { 
    for (int i = 4; i < a.length; i++) { 
    a[i-4]=a[i]; 
    } 
    for (int i = a.length - 1; i > a.length - 5; i--) { 
    a[i] = 0; 
    } 
} 

Второй лучший вариант был бы System.arraycopy) (- O (п) пространство, O (п).

+0

Вы не можете установить член байтового массива в 'null'; вы получите ошибку компилятора в этой строке. – Jules

0

У вас большая проблема, чем пропустить 4 байта в начале каждого из ваших пакетов. Ваш код делает это:

 byte byteArr[] = new byte[28]; 

     try { 
      while ((input = in.read(byteArr)) != -1) { 
       System.out.println("Size read is " + input); 
       System.out.println("Data is " + bytesToHex(byteArr)); 
      } 

(закомментированные линии удалены)

Обратите внимание, что вы не можете гарантировать, что все 28 байт будут прочитаны на каждый вызов in.read(), но ваш метод bytesToHex() приобретают что в массиве присутствует 28 действительных байтов. Вам необходимо собрать данные, которые вы читаете в массиве, пока у вас не будет весь пакет до его обработки, возможно, используя DataInputStream с помощью метода readFully(byte[]). Затем вы можете пропустить первые 4 байта, как было предложено в других ответах.

+0

: -yeah его true, но in.readFully (byteArr) приведет к ошибке несоответствия типа: невозможно преобразовать из void в int – Miller

+0

Это потому, что readFully всегда либо заполняет массив байтов (чтение всех 28 байтов), либо генерирует исключение EOFException. – Jules

+0

может дать образец кода для этого – Miller

3

Вы можете использовать метод Arrays.copyOfRange для фильтрации нежелательных байтов и сохранения результата в новый массив байтов.

byte[] filteredByteArray = Arrays.copyOfRange(byteArr, 4, byteArr.length - 4); 
+2

, на самом деле есть ошибка в этом коде. Он должен быть байт [] filterByteArray = Arrays.copyOfRange (byteArr, 4, byteArr.length); – morpheus

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