How to remove first 4 bytes from a byte array in Java?

26.8k views Asked by At

I have a byte array named byteArr[].I need to remove first 4 bytes from it.My code is shown below. Here I use the byte array to store the input string.I got some unwanted byte with the output i.e the first four bytes is not needed from the fifth onwards is correct. My program is to take id from respected rfid tag using an rfid machine.

public class Serverc {

    final protected static char[] hexArray = "0123456789ABCDEF".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();
    }
}

Here is my console

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

Here I need to remove 55000016 from the output. Advance thanks

4

There are 4 answers

0
Elliott Frisch On BEST ANSWER

If you want to skip the first four bytes change this,

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

to something like

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

Or you might use String.substring(int)

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

It is best for you to skip the 4 bytes. But if you want to remove them, you should use this solution (your array may become massive). This algorithm is best you can get in Java for your problem. O(1) space , O(n) time.

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;
  }
}

Second best option would be System.arrayCopy() - O(n) space, O(n) time.

3
Jules On

You have a larger problem than skipping the 4 bytes at the start of each of your packets. Your code does this:

       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));
            }

(commented-out lines removed)

Note that you cannot guarantee that all 28 bytes will be read on each call to in.read(), but that your bytesToHex() method is assuming that 28 valid bytes are present in the array. You need to collect data that you read into the array until you have all of your packet before processing it, probably using a DataInputStream with the method readFully(byte[]). Then you can skip the first 4 bytes as suggested in the other answers.

1
Pasang Sherpa On

You could use Arrays.copyOfRange method to filter the unwanted bytes and save the result to a new byte array.

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