Sida 1 av 1

Vad händer här? [php]

Postat: 04 jul 2009, 20:20
av rancor
Hej, behöver lite hjälp med denna classen.

Vad gör följand två rader?

Kod: Markera allt

$encoded .= ModHex::$TRANSKEY[((int)$bin >> 4) & 0xf];
$encoded .= ModHex::$TRANSKEY[ (int)$bin & 0xf];
Som jag förstår är ModHex är en klass och $TRANSKEY är en sträng som man adderar till strängen $encoded men vad händer mellan []?

Kod: Markera allt

/*
        yubikey.php
        Written by John E. Woltman IV
        Released under the LGPL v2.
        Based on code from Yubico's C and Java server samples.
        
        WARNING: I have not tested this with an actual yubikey yet, only with
        the sample output included in yubico-c's README file.
        
        NOTICE: This class DOES NOT track or log a Yubikey's counters and
        timestamps.  You can use this code to integrate Yubikey authentication
        into your own backend authentication system and keep track of the necessary
        information yourself.
        
        Please see the file yubitest.php for a test scenario.
        
*/
class ModHex {

        static $TRANSKEY = "cbdefghijklnrtuv"; // translation key used to ModHex a string

        // ModHex encodes the string $src
        static function encode($src) {
                $encoded = "";
                $i = 0;
                $srcLen = strlen($src);
                for ($i = 0; $i < $srcLen; $i++) {
                        $bin = (ord($src[$i]));
                        $encoded .= ModHex::$TRANSKEY[((int)$bin >> 4) & 0xf];
                        $encoded .= ModHex::$TRANSKEY[ (int)$bin & 0xf];
                }
                return $encoded;
        }

        // ModHex decodes the string $token.  Returns the decoded string if successful,
        // or zero if an encoding error was found.
        static function decode($token) {
                $tokLen = strlen($token);       // length of the token
                $decoded = "";                          // decoded string to be returned

                // strings must have an even length
                if ( $tokLen % 2 != 0 ) { return FALSE; }

                for ($i = 0; $i < $tokLen; $i=$i+2 ) {
                        $high = strpos(ModHex::$TRANSKEY, $token[$i]);
                        $low = strpos(ModHex::$TRANSKEY, $token[$i+1]);

                        // if there's an invalid character in the encoded $token, fail here.
                        if ( $high === FALSE || $low === FALSE )
                                return FALSE;

                        $decoded .= chr(($high << 4) | $low);
                }
                return $decoded;
        }
// rancor

Re: Vad händer här? [php]

Postat: 05 jul 2009, 13:03
av micke_nordin
[] är indexeringsoperatorn

ett exempel:

Kod: Markera allt

	
<?php 
$name="Micke Nordin";
echo "Initialerna är: " . $name[0] . $name[6];
?>
Vilket ger utskriften Initialerna är: MN.

I det här fallet verkar det som om man lägger till ett tecken från strängen ModHex::$TRANSKEY på strängen $encoded genom att indexera på uttrycket: ((int)$bin >> 4) & 0xf.

Uttrycket innehåller två bitwise operators ( >> och &), jag brukar inte använda mig av dessa så jag kan inte så mycket om dem men här kan du läsa mer om bitwise operators: http://se.php.net/manual/en/language.op ... itwise.php

/Micke

Re: Vad händer här? [php]

Postat: 05 jul 2009, 13:09
av micke_nordin
(int)$bin betyder förövrigt att innehållet i variabeln $bin skall tolkas som ett heltal, ett exempel:

Kod: Markera allt

<?php 
$string = "10 små siffror";
echo (int)$string;
?>
ger utskriften: 10

Det kallas för (explicit) type casting.

/Micke

Re: Vad händer här? [php]

Postat: 05 jul 2009, 13:35
av KiviE

Kod: Markera allt

((int)$bin >> 4) & 0xf
Skifta talet i $bin 4 steg till höger vilket medför division. Ett steg medför division med 2. Skifta 4 steg blir då division med 16. & är en AND operation, dvs att bitarna som är satta i skiftningen och i det hexadecimala talet 0xf jämförs och blir satta om de är samma.

Är inte så haj på det själv men något sådant är det. Läs på länken som micke_nordin skicka så fattar du nog.

Re: Vad händer här? [php]

Postat: 05 jul 2009, 13:50
av rancor
Tackar!

Jag får labba lite för att jag skall få riktigt bra koll på det

// rancor

Re: Vad händer här? [php]

Postat: 05 jul 2009, 14:51
av Konservburk
Det här är egentligen inte speciellt komplicerat. Låt oss ta ett exempel där (int)$b är talet 2357, vilket i binär form blir 100100110101. Bitshift-operatorn >> flyttar alla bitar åt höger, i det här fallet fyra steg. Resultatet blir då 000010010011. Bitmasknings-operatorn & nollställer alla bitar som inte är 1 i bitmasken. Bitmasken är i det här fallet 0xf, vilket i binär form blir 000000001111.

(int)$b 100100110101 2357
(int)$b >> 4 000010010011 147
0xf 000000001111 15
((int)$b >> 4) & 0xf 000000000011 3
(int)$b & 0xf 000000000101 5


Oavsett vad (int)$b är för tal så kommer (int)$b & 0xf att plocka ut de gröna bitarna,
medan ((int)$b >> 4) & 0xf plockar ut de blå bitarna.

Re: Vad händer här? [php]

Postat: 05 jul 2009, 19:43
av hagelnut
Kan man uttrycka det så här?
Om talet skrivs på hexadecimal form så kommer andra siffran från höger att plockas ut. Ex. 3a1 -> a, 123->2, osv.