2009-04-17 8 views
-1

Ich habe einige Probleme mit dieser Syntax. Könnte mir jemand erklären, was diese C-Funktion macht?Kann jemand diese C-Funktion erklären?

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

Vielen Dank!

+0

Ist diese Frage über C-Syntax oder den Zweck von protodec_henten()? – Tom

+0

"Erklären Code" -Fragen sind im Allgemeinen "dumm" daher, dass wir nicht wissen, ob er wissen will, was eine Funktion ist, was bitweise oder ist, oder über das Ergebnis der Funktion. –

+5

Es ist schwierig, den Zweck der Funktion ohne einen Beispielanruf zu bestimmen. Es könnte einer Schar verschiedener Zwecke dienen (manche esoterisch, andere ziemlich einfach), je nachdem, welcher Rahmen enthält. – Pesto

Antwort

15

Ich schätze, Sie beziehen sich auf die folgende Zeile als die mit der verwirrenden Syntax.

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

Läßt diese brechen

  • Rahmen [from + i]: "aus" steht für einen anfänglichen Index in dem Array und i ist einfach die aktuellen Offset. Dies bedeutet, dass das Array beginnend mit dem Index "from"
  • effektiv iteriert. Size - 1 - i: Dies berechnet die Anzahl der Bits, die verschoben werden sollen, und dies basierend auf dem aktuellen Index. Diese Nummer beginnt mit der Größe -1 und verringert sich mit fortschreitender Schleife
  • (frame [from + i] < < (size - 1 - i)): Verschiebt den Wert von + i um die angegebene Anzahl von Bits
  • tpm | = ...: Dos eine bitweise Oder Ausdruck auf den Bytes, die noch verfügbar sind, sobald der iterierten Wert verschoben wurde
+2

+1 du bist der einzige, der ausführlich erklärt, was er wollte – TStamper

+2

Verschiebt es sich nicht um die angegebene Anzahl von Bits, nicht Bytes? –

+0

@Jeff, ja Bits nicht Bytes (korrigiert den Tippfehler) – JaredPar

0

Sieht aus wie eine Hash-Funktion. Auf den zweiten Gedanken würde dies eine ziemlich schlechte Hash-Funktion machen.

Sie verschieben jedes Bild um den Rest der Größe und dann ORing mit einem statischen Wert. Dieser Wert wird zurückgegeben.

+0

Habe gerade gemerkt, dass es eine beschissene Hashing-Funktion wäre, da der Wert schließlich 1111 1111 erreichen würde. –

+0

Ja, xor (^) ist das, was man für eine Hash-Funktion haben möchte, nicht oder (|). –

0

Ich denke, Sie verstehen nicht die tmp |=, weil dies wahrscheinlich der einzige Teil in dem Code ist, der "Hard" zu verstehen ist. Wenn Sie versuchen, nach C-Operatoren zu suchen, finden Sie eine Liste here, jetzt |= bedeutet "Bitwise oder", können Sie mehr über sie here lesen.

Also, was dieser Code wirklich tut, ist, dass es einige Eingaben benötigt, Sie sagen dem functon, wo im "buffer"/"frame" zu lesen und Sie bitweise oder auf so viele Positionen wie der Parameter "size" sagt .

+1

| ist bitweise ODER, | = ist bitweiser ODER-Zuweisungsoperator. – Samuel

+0

Ja, muss ich erklären, dass = immer zuweist? –

7

Andere beschrieben bereits jede Zeile, also werde ich nur noch hinzufügen, was die Funktion. funktioniert. Sie können sich vorstellen Bytes in frame zwischen Positionen (from) und (from+size) auf einem "Stapel" mit unterschiedlicher Position st Byte wird auf der linken Seite platziert.

Jetzt tmp hat ein Bit gesetzt, wenn eines der Bytes "unter" ein Bit in der zugehörigen Position gesetzt hat.

0

Aufgrund der bitweisen OR, macht diese Funktion nur Sinn, wenn alle Werte in frame sind 0 oder 1.

In diesem Fall wird es size aufeinanderfolgende Werte (dh Bits) frame bei Index beginnend setzen from in eine einzige unsigned long. Das letzte Bit (bei Index from+size-1) wird als niedrigstwertiges Bit eingefügt.

-3

Dieser Gesamtcode kopiert nur eine Reihe von Daten in die Variable tmp. In der Tat, es ist einfach eine memcpy auf die harte Tour.

Warum nicht einfach: memcpy (& tmp, Frame + aus, Größe)

+0

Vergiss es. Es verschiebt Bits und nicht Bytes. –

2

wie ein Bit-Packer Sieht aus. Wenn, wie Eric vorgeschlagen hat, alle Zeichen in frame entweder 0 oder 1 sind, dann werden size Zeichen benötigt und ihre Werte in tmp verpackt. Wenn beispielsweise frame (bei Offset start) die Werte 00 01 00 00 01 01 01 00 enthält, würde protodec_henten(0,8,frame) zurückgeben (führende Nullen werden weggelassen) 0x4E (oder 01001110 im Binärformat). Es gibt bessere Möglichkeiten, dies zu tun, also könnte es etwas anderes tun, aber es ist schwer zu sagen, was.

Verwandte Themen