2009-04-17 7 views
-1

J'ai quelques problèmes avec cette syntaxe. Quelqu'un pourrait-il m'expliquer ce que fait cette fonction C?Quelqu'un peut-il expliquer cette fonction C?

unsigned long protodec_henten(int from, int size, unsigned char *frame) 
{ 
    int i = 0; 
    unsigned long tmp = 0; 

    for (i = 0; i < size; i++) 
    tmp |= (frame[from + i]) << (size - 1 - i); 

    return tmp; 
} 

Merci!

+0

Est-ce que cette question concerne la syntaxe C ou l'objectif de protodec_henten()? – Tom

+0

"Expliquer le code" - les questions sont en général "stupides" d'où l'on ne sait pas s'il veut savoir ce qu'est une fonction, quel est le bit ou quel est le résultat de la fonction. –

+5

Il est difficile de déterminer le but de la fonction sans un exemple d'appel. Il pourrait servir une multitude de fins différentes (certaines ésotériques, d'autres assez simples) en fonction de ce que le cadre contient. – Pesto

Répondre

15

Je suppose que vous faites référence à la ligne suivante comme celle avec la syntaxe confuse.

tmp |= (frame[from + i]) << (size - 1 - i); 

Permet de décomposer

    cadre
  • [de + i]: "from" représente un indice initial dans la matrice et i est simplement le courant de décalage. Donc c'est itérativement le tableau commençant à l'index "de"
  • taille - 1 - i: Ceci calcule le nombre de bits à déplacer par et fait en fonction de l'index actuel. Ce nombre commencera à la taille -1 et diminuera au fur et à mesure que la boucle progressera.
  • (frame [from + i] < < (size - 1 - i): Déplace la valeur à partir de + i du nombre de bits spécifié
  • tpm | = ...: Dos bitwise Ou expression sur les octets qui sont encore disponibles une fois que la valeur itérées a été déplacé
+2

+1 vous êtes le seul qui a expliqué en détail probablement ce qu'il voulait – TStamper

+2

N'est-ce pas un décalage du nombre de bits spécifié, pas des octets? –

+0

@Jeff, oui bits pas octets (corrigé la faute de frappe) – JaredPar

0

Cela ressemble à une fonction de hachage. A la deuxième réflexion, cela ferait une très mauvaise fonction de hachage.

Ils décaleront chaque image du reste de la taille, puis OR avec une valeur statique. Cette valeur est ensuite renvoyée.

+0

Je me suis juste rendu compte que ce serait une fonction de hachage merdique puisque finalement la valeur arriverait à 1111 1111. –

+0

Ouais, xor (^) est ce que vous voulez pour une fonction de hachage, pas ou (|). –

0

Je suppose que vous ne comprenez pas le tmp |= parce que c'est probablement la seule partie du code qui est "difficile" à comprendre. Si vous essayez de rechercher des opérateurs C, vous trouverez une liste here, maintenant |= signifie "Bitwise ou", vous pouvez en savoir plus à leur sujet here.

Donc ce que ce code fait est qu'il prend une entrée, vous dites à la fonction où commencer à lire dans le "tampon"/"frame" et vous faites bit ou autant de positions que le paramètre "size" .

+1

| est au niveau du bit OR, | = est un opérateur d'affectation OU bit à bit. – Samuel

+0

Oui bien dois-je expliquer que = assigne toujours? –

7

D'autres déjà décrit chaque ligne, donc je vais juste ajouter ce que la fonction. fait.Vous pouvez imaginer des octets dans frame entre les positions (from) et (from+size) sur une "pile" avec une position différente. st octet sera placé sur la gauche.

bits from:  tmp: | + +  |(LSB-side of tmp) 
frame[from]:   ---+---- 
frame[from+1]:   -----+-- 
frame[from+2]:   -+------ 
... 

Maintenant tmp a un bit si l'un des octets « ci-dessous » a un bit dans la position correspondante.

0

En raison du bit OU, cette fonction n'a de sens que si toutes les valeurs frame sont 0 ou 1.

Dans ce cas, il sera mis size valeurs consécutives (c.-à-bits) de frame à partir de l'index from en un seul unsigned long. Le dernier bit (à l'index from+size-1) sera inséré comme bit le moins significatif.

-3

Ce code global ne fait que copier une plage de données dans la variable tmp. En fait, c'est simplement faire un mémcpy à la dure.

Pourquoi ne pas faire simplement: memcpy (& tmp, cadre + de, taille)

+0

Nevermind. Il s'agit de bits changeants, et non d'octets. –

2

On dirait un packer peu. Si, comme Eric l'a suggéré, tous les caractères dans frame sont zéro ou un, alors cela prendra size caractères et emballer leurs valeurs dans tmp. Par exemple, si frame (au décalage start) contient les valeurs 00 01 00 00 01 01 01 00, alors protodec_henten(0,8,frame) retournera (zéros en tête omis) 0x4E (ou 01001110 en binaire). Il y a de meilleures façons de le faire, donc ça peut faire autre chose, mais c'est difficile de dire quoi.

Questions connexes