fatmanming
fatmanming

Reputation: 185

copy bytes from one array to another without iteration in Java

is there a quicker way to copy bytes from one array to another without iteration ?

I'm reading bytes via Bluetooth from the input stream

public void run() {
        byte[] buffer = new byte[100];  // buffer store for the stream
        int bytes; // bytes returned from read()
        // Keep listening to the InputStream until an exception occurs
        while (true) {
            try {
                // Read from the InputStream
                bytes = mmInStream.read(buffer); // Get number of bytes and message in "buffer"
                h.obtainMessage(RECIEVE_MESSAGE, bytes, -1, buffer).sendToTarget();     // Send to message queue Handler
            } catch (IOException e) {
                break;
            }
        }
    }

This sends a random number of bytes to the handler. I then read these and put them into an array to then process the data when the download is complete. The data being sent from a PIC micro is 6055 bytes long.

h = new Handler() {
            public void handleMessage(android.os.Message msg) {
                switch (msg.what) {
                    case SUCCESS_CONNECT:
                        // Connected so start connected thread
                        btSocket = (BluetoothSocket) msg.obj;
                        byteCount = 0;
                        arrayCount = 0;
                        mConnectedThread = new FullDataActivity.ConnectedThread(btSocket);
                        mConnectedThread.start();
                        mConnectedThread.write(getFullDataConByte); // Send 255 to start
                        break;
                    case RECIEVE_MESSAGE:  // if receive massage
                        byte[] readBuf = (byte[]) msg.obj;
                        // iterate through obj and copy bytes to fullDataChunk array
                        for (int a = 0; a < msg.arg1; a++) {
                            fullDataChunk[byteCount] = readBuf[a];
                            Log.d("readBuf[a] = ",Integer.toString(readBuf[a] & 0xFF));
                            byteCount++;
                        }
                        // if all bytes done process
                        if (byteCount == 6055) {// process data when complete.

My handler is missing bytes somewhere and corrupting the data when its copying them in the for loop. I don't know if the run method is sending new bytes to the handler before the rest are processed in the for loop. I've done a Log of the bytes sent in the Run and they are right. It's when the handler is processing that they go wrong.

I either need to ensure the data sent is processed before new data is sent, or copy the data to the array quicker ? Anyone any ideas.

Upvotes: 5

Views: 7954

Answers (2)

Abacus
Abacus

Reputation: 19431

The fastest way to copy an array should be by using System.arraycopy() .

Upvotes: 7

fatmanming
fatmanming

Reputation: 185

Did this in the run, then the handler receives full array without errors.

  public void run() {
            byte[] fullBuffer = new byte[6055];
            byte[] buffer = new byte[100];  // buffer store for the stream
            int bytes; // bytes returned from read()
            int bytesCount = 0;
            // Keep listening to the InputStream until an exception occurs
            while (true) {
                try {
                    // Read from the InputStream
                    bytes = mmInStream.read(buffer);        // Get number of bytes and message in "buffer"
                    System.arraycopy(buffer,0,fullBuffer,bytesCount,bytes);
                    bytesCount = bytesCount + bytes;
                    Log.d("FD Read - ", Integer.toString(bytesCount));
                    if(bytesCount >= 6055){
                        h.obtainMessage(RECIEVE_MESSAGE, bytesCount, -1, fullBuffer).sendToTarget();     // Send to message queue Handler
                        Log.d("FD Read - ", "Message sent");
                        bytesCount = 0;
                        Log.d("FD Read - ", "bytesCount re-set");
                    }
                    //h.obtainMessage(RECIEVE_MESSAGE, bytes, -1, buffer).sendToTarget();     // Send to message queue Handler
                } catch (IOException e) {
                    break;
                }
            }
        }

Upvotes: 2

Related Questions