2014-11-14 132 views
1

我有一個名爲byteArr[]的字節數組,我需要從中移除前4個字節。我的代碼如下所示。在這裏,我使用字節數組來存儲輸入字符串。我得到了一些不需要的字節,即從第五位起不需要前四個字節是正確的。我的程序是使用rfid機器從尊重的rfid標籤中獲取id。如何從Java中的字節數組中刪除前4個字節?

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

如果你的陣列是不是大規模的,只是把它轉換成一個列表,然後通過一個刪除一個元素(該列表將轉移陣列)的基礎上讀取標籤我的陣列有可能成爲massive.because在我的應用程序 –

+0

大量的標籤需要被採納 – 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(n)空間,O(n)時間。

+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個有效字節。您需要收集您讀入陣列的數據,直到處理完所有數據包,然後使用方法readFully(byte[])DataInputStream然後您可以跳過其他答案中建議的前4個字節。

+0

:-yeah其真實但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

這個代碼中實際上有一個錯誤。它應該是byte [] filteredByteArray = Arrays.copyOfRange(byteArr,4,byteArr.length); – morpheus

相關問題