2012-03-08 2 views
0

J'ai un tampon avec n octets, mais je veux seulement lire en sizeof (quelque chose) octets à partir de l'octet 3, ce qui signifie que je ne veux pas lire les octets 1 et 2 du tampon. Par exemple ...Y a-t-il un "lseek" à memmove?

Pour certains tampons, l'octet 1 = 'a', l'octet 2 = 'b', l'octet 3 = la variable uint64_t. Ce que je veux faire est quelque chose comme

1. set begin to byte 3 
2. read in sizeof(uint64_t) bytes from buffer using memmove 
+3

Est-ce que le pointeur mathématique et le lancer trop dur pour vous? –

Répondre

2

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

0

Pourquoi ne pas utiliser simplement ceci:

uint64_t num; 
num = * ((uint64_t *) (buffer + 2)) 
+0

Parce qu'il peut échouer si cette adresse est mal alignée. –

+0

Droite. Ok, tu ferais mieux d'utiliser 'memcpy' d'une certaine façon, mais je vois que tu as déjà fait une bonne réponse en expliquant ça :) – xato

Questions connexes