Как я могу использовать часть byte [] без arraycopy? - PullRequest
3 голосов
/ 14 июня 2011

Интересно, как использовать часть байта [] без arraycopy?

На языке C

char buf[100];
int i;

for (i = 0; i < 100; i += 10) {
    proc(buf + i);
}

Но В Java ,

byte[] buf = new byte[100];
int i;

for (i = 0; i < 100; i += 10) {
    proc(buf + i);
}

не работает.

byte[] buf = new byte[100];
int i;

for (i = 0; i < 100; i += 10) {
    byte[] temp = new byte[10];
    System.arraycopy(buf, i, temp, 0, 10);
    proc(temp);
}

только работает.

Но я не люблю arraycopy.

Как можноЯ решаю эту проблему?

Ответы [ 6 ]

8 голосов
/ 14 июня 2011

Вы всегда можете расширить вашу функцию "proc", чтобы получить 3 параметра, например так:

proc(byte[] a, int offset, int length)

Это лучший способ имитировать функциональность C-массива в Java.

3 голосов
/ 22 декабря 2011

Класс java.util.Arrays имеет несколько полезных методов, таких как:

byte[] buf = new byte[100];
int i;

for (i = 0; i < 100; i += 10) {
    proc(Arrays.copyOfRange(buf, i, buf.length));
}

больше: copyOfRange

1 голос
/ 22 декабря 2011

Поскольку ни один из ответов не включал ByteBuffer, я покажу другой путь:

import java.nio.ByteBuffer;

public class ProcByteBuffer {

    private static final int BUF_SIZE = 10;
    private static final int BIG_BUF_SIZE = 10 * BUF_SIZE;

    public static void proc(final ByteBuffer buf) {

        // for demo purposes
        while (buf.hasRemaining()) {
            System.out.printf("%02X", Integer.valueOf(buf.get() & 0xFF));
        }
    }

    public static void main(String[] args) {
        final ByteBuffer bigBuf = ByteBuffer.allocate(BIG_BUF_SIZE);

        // for demo purposes
        for (int i = 0; i < BIG_BUF_SIZE; i++) {
            bigBuf.put((byte) i);
        }
        bigBuf.position(0);

        for (int i = 0; i < BIG_BUF_SIZE; i += BUF_SIZE) {
            bigBuf.position(i);
            bigBuf.limit(i + BUF_SIZE);
            proc(bigBuf.slice());
        }
    }
}

Любые изменения в срезе (аргумент buf для proc ()) будут видны базовому массиву.

1 голос
/ 14 июня 2011

Попробуйте использовать следующий код вместо arraycopy

byte[] buf = new byte[100];
        int i;

        for (i = 0; i < 100; i += 10) {
            byte[] temp = new byte[10];
                  temp[i%10] = buf[i];



        }

Спасибо Deepak

1 голос
/ 14 июня 2011

Просто передайте индексный параметр вашему proc

void proc(byte[] array, int index)
{
    for (int i = index; i < array.length; ++i)
    {
        // do something   
    }     
}
0 голосов
/ 14 июня 2011

В C массив - это просто указатель на где-то в памяти, и buf + i имеет значение (это означает место в памяти, на котором я байт - который также является массивом)

В Java массив - это объект с длиной и кодом. Нет никакой ссылки на «массив внутри массива», а оператор «+» не имеет смысла.

...