D'abord, un peu de clarification. L'indexation du tableau C commence à 0, et non à 1, donc il est plus précis de dire que l'octet 0 est 'a'
et l'octet 1 est 'b'
. Deuxièmement, votre troisième octet ne peut pas contenir une variable uint64_t
, mais l'index 2 peut très bien être le commençant d'un objet uint64_t
.
Non, il n'y a pas d'équivalent lseek
pour memmove()
- car, contrairement aux opérations sur les fichiers, un appel à memmove()
doit spécifier le point de départ. Dans ce cas, vous pouvez également utiliser memcpy()
plutôt que memmove()
. La seule différence entre eux est que memmove()
gère correctement les tampons qui se chevauchent. Puisque votre source et votre cible sont des objets distincts, ce n'est pas un problème. Cela ne va pas affecter de manière significative la vitesse de votre code, mais quiconque le lira n'aura pas à se demander pourquoi vous avez choisi d'utiliser memmove()
.
Étant donné:
unsigned char buf[SOME_SIZE];
uint64_t target;
vous pouvez faire quelque chose comme ceci:
memcpy(&target, buf+2, sizeof target);
Notez que je sizeof target
plutôt que sizeof (uint64_t)
. L'une ou l'autre fonctionnera, mais l'utilisation de sizeof target
rendra votre code plus résilient (moins vulnérable aux erreurs lorsque vous le changerez plus tard). Si vous décidez de changer le type de target
, vous n'avez pas besoin de vous souvenir de changer le type dans l'appel memcpy()
.
Est-ce que le pointeur mathématique et le lancer trop dur pour vous? –