我有一个byte [],想将其复制到另一个byte []中。也许我在这里展示了我简单的“ C”背景,但是在Java字节数组中是否有等同于memcpy()的东西?
Answers:
您可以尝试System.arraycopy
或使用阵列功能,在Arrays
像类java.util.Arrays.copyOf
。两者都应在引擎盖下为您提供本机性能。
Arrays.copyOf可能对可读性有利,但仅在Java 1.6中引入。
byte[] src = {1, 2, 3, 4};
byte[] dst = Arrays.copyOf(src, src.length);
System.out.println(Arrays.toString(dst));
System.arraycopy(sourceArray,
sourceStartIndex,
targetArray,
targetStartIndex,
length);
例,
String[] source = { "alpha", "beta", "gamma" };
String[] target = new String[source.length];
System.arraycopy(source, 0, target, 0, source.length);
或使用Arrays.copyOf()
示例,
target = Arrays.copyOf(source, length);
java.util.Arrays.copyOf(byte[] source, int length)
是在JDK 1.6中添加的。
该copyOf()
方法用于System.arrayCopy()
制作数组的副本,但是比clone()
您可以制作数组部分的副本更灵活。
您可以使用System.arrayCopy。它将元素从源数组复制到目标数组。Sun实施使用手动优化的汇编器,因此速度很快。
Java实际上确实像memcpy()一样。Unsafe类具有copyMemory()方法,该方法与memcpy()基本上相同。当然,与memcpy()一样,它也不提供对内存覆盖,数据破坏等的保护。目前尚不清楚它是memcpy()还是memmove()。它可用于从实际地址复制到实际地址或从引用复制到引用。请注意,如果使用引用,则必须提供一个偏移量(否则JVM将尽快终止)。
Unsafe.copyMemory()可以正常工作(在旧的旧PC上每秒高达2 GB)。使用风险自负。请注意,并非所有JVM实现都存在Unsafe类。
sun.misc.Unsafe
该类被认为是不好的习惯,因为它是私有包类。另外,从Java 9开始,它将不再可用,因此尝试使用此类与请求代码意外中断相同。
使用byteBufferViewVarHandle或byteArrayViewVarHandle。
这样,您就可以将“ longs”数组直接复制到“ doubles”数组中,并且类似以下内容:
public long[] toLongs(byte[] buf) {
int end = buf.length >> 3;
long[] newArray = new long[end];
for (int ii = 0; ii < end; ++ii) {
newArray[ii] = (long)AS_LONGS_VH.get(buf, ALIGN_OFFSET + ii << 3);
}
}
private static final ALIGN_OFFSET = ByteBuffer.wrap(new byte[0]).alignmentOffset(8);
private static final VarHandle AS_LONGS_VH = MethodHandles.byteArrayViewVarHandle(long[].class, ByteOrder.nativeOrder());
这将使您可以像以下那样进行一些黑客攻击:
float thefloat = 0.4;
int floatBits;
_Static_assert(sizeof theFloat == sizeof floatBits, "this bit twiddling hack requires floats to be equal in size to ints");
memcpy(&floatBits, &thefloat, sizeof floatBits);