我想知道如何使用byte []的一部分而不使用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。
我该如何解决这个问题?
答案 0 :(得分:8)
您可以随时扩展“proc”功能以获取3个参数:
proc(byte[] a, int offset, int length)
这是模仿Java中C阵列功能的最佳方式。
答案 1 :(得分:3)
班级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
答案 2 :(得分:1)
只需将索引参数传递给proc
void proc(byte[] array, int index)
{
for (int i = index; i < array.length; ++i)
{
// do something
}
}
答案 3 :(得分:1)
尝试使用以下代码而不是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];
}
由于 迪帕克
答案 4 :(得分:1)
由于没有任何答案包括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());
}
}
}
切片的任何更改(proc()的buf参数都将对底层数组可见。
答案 5 :(得分:0)
在C中,数组只是一个指向内存中某处的指针,而buf + i具有意义(它意味着内存中的一个位置是i字节 - 也是一个数组)
在java中,Array是一个附加长度和代码的对象。没有办法引用“数组内部的数组”,而“+”运算符没有意义。