2014-11-14 91 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

相关问题