50 votes

memcpy avec startIndex ?

Je souhaite copier un contenu d'une longueur spécifique d'une mémoire tampon à une autre à partir d'un point de départ spécifique. J'ai vérifié memcpy() mais il ne prend en compte que la longueur du contenu à copier alors que je souhaite également spécifier l'index de départ.

Existe-t-il une fonction qui permette de faire cela ou une bonne approche pour le faire avec le système existant ? memcpy fonction ?

100voto

Goz Points 35007

Je préfère toujours la syntaxe

memcpy( &dst[dstIdx], &src[srcIdx], numElementsToCopy * sizeof( Element ) );

33voto

Il suffit d'ajouter le décalage souhaité à l'adresse du tampon.

char abuff[100], bbuff[100];
....
memcpy( bbuff, abuff + 5, 10 );

Cette opération copie 10 octets à partir de abuff[5] dans bbuff.

14voto

sharptooth Points 93379

Il suffit d'ajouter le décalage aux adresses. Par exemple, si vous voulez copier le tampon à partir du Nième octet :

memcpy( destination, source + N, sourceLen - N );

Cette opération permet de copier dans la base de données destination . Si vous souhaitez également décaler la destination, ajoutez le décalage aux deux :

memcpy( destination + N, source + N, sourceLen - N );

4voto

JaredPar Points 333733

Un index n'est pas nécessaire car il suffit de mettre à jour le pointeur de la source du nombre d'octets spécifié. Le wrapper suivant devrait faire l'affaire

void* memcpy_index(void *s1, const void *s2, size_t index, size_t n) {
  s2 = ((char*)s2)+index;
  return memcpy(s1, s2,n);
}

2voto

Edouard A. Points 5047

Il suffit d'augmenter le pointeur jusqu'à l'indice de départ.

Exemple

const unsigned char * src = reinterpret_cast<const unsigned char*>(your source);
unsigned char * dest = reinterpret_cast<unsigned char *>(your dest);
memcpy(dest, src + offset, len);

Qu'en est-il de l'utilisation des collections STL pour éviter les erreurs d'accès à la mémoire ?

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