98 votes

Existe-t-il un équivalent de memcpy() en Java ?

J'ai un byte[] et je voudrais le copier dans un autre byte[]. Peut-être que je montre ici mes simples connaissances en 'C', mais existe-t-il un équivalent de memcpy() sur les tableaux d'octets en Java ?

2voto

Artem Barger Points 18789

Vous pouvez utiliser System.arraycopy

2voto

Amila Weerasinghe Points 511

Si vous utilisez JDK 1.5+, vous devez utiliser

System.arraycopy()

Au lieu de

Arrays.copyOfRange()

Parce que Arrays.copyOfRange() n'a pas été ajouté avant le JDK 1.6. Vous pouvez donc obtenir

Java - “Cannot Find Symbol” error

lors de l'appel de Arrays.copyOfRange dans cette version du JDK.

0voto

Utilisez byteBufferViewVarHandle ou byteArrayViewVarHandle.

Cela vous permettra de copier un tableau de "longs" directement vers un tableau de "doubles" et similaires avec quelque chose comme :

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());

Cela vous permettra de faire les piratages que vous souhaitez :

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

0voto

Non. Java n'a pas d'équivalent à memcpy . Java a un équivalent de memmove à la place.

Si les arguments src et dest font référence au même objet tableau, alors la copie est effectuée comme si les composants aux positions srcPos à srcPos+longueur-1 étaient d'abord copiés dans un tableau temporaire avec des composants de longueur, puis le contenu du tableau temporaire était copié aux positions destPos à destPos+longueur-1 du tableau de destination.

Docs Oracle

Il est très probable System.arraycopy n'aura jamais les mêmes performances que memcpy si src y dest font référence au même tableau. En général, cela sera assez rapide.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X