时间:2010-07-25 12:21:34

标签: java bytearray

9 个答案:

答案 0 :(得分:90)

答案 1 :(得分:81)

答案 2 :(得分:7)

答案 3 :(得分:5)

答案 4 :(得分:3)

Java确实有类似memcpy()的东西。 Unsafe类有一个copyMemory()方法,它与memcpy()基本相同。当然,就像memcpy()一样,它不提供内存覆盖,数据破坏等保护。目前尚不清楚它是真的是memcpy()还是memmove()。它可用于从实际地址复制到实际地址或从引用复制到引用。请注意,如果使用了引用,则必须提供偏移量(或者JVM将尽快消亡)。

Unsafe.copyMemory()可以工作(在我旧的PC上每秒高达2 GB)。使用风险由您自己承担。请注意,并非所有JVM实现都存在Unsafe类。

答案 5 :(得分:2)

答案 6 :(得分:2)

在使用JDK 1.5+时,应使用

System.arraycopy()

代替

Arrays.copyOfRange()

因为直到JDK 1.6才添加Arrays.copyOfRange(),所以您可能会得到

Java - “Cannot Find Symbol” error

在该版本的JDK中调用Arrays.copyOfRange时。

答案 7 :(得分:1)

否。 Java没有等效于memcpy。 Java等效于memmove

  

如果src和dest参数引用相同的数组对象,则执行复制,就好像首先将srcPos到srcPos + length-1位置上的分量复制到具有length分量的临时数组中,然后将临时数组通过目标数组的destPos + length-1复制到了位置destPos。

Oracle Docs

如果System.arraycopymemcpy引用相同的数组,很有可能src的性能永远不会与dest相同。通常,这会足够快。

答案 8 :(得分:0)

使用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);