Vad händer här? [php]

Här diskuteras programmering och utveckling
Användarvisningsbild
rancor
Inlägg: 1649
Blev medlem: 18 maj 2006, 23:33
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS

Vad händer här? [php]

Inlägg 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
Användarvisningsbild
micke_nordin
Inlägg: 1539
Blev medlem: 21 aug 2008, 17:03
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

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

Inlägg 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
Användarvisningsbild
micke_nordin
Inlägg: 1539
Blev medlem: 21 aug 2008, 17:03
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

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

Inlägg 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
Senast redigerad av 1 micke_nordin, redigerad totalt 5 gånger.
KiviE
Inlägg: 2157
Blev medlem: 25 okt 2007, 14:00
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS
Ort: Luleå

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

Inlägg 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.
Användarvisningsbild
rancor
Inlägg: 1649
Blev medlem: 18 maj 2006, 23:33
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS

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

Inlägg av rancor »

Tackar!

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

// rancor
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

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

Inlägg 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.
hagelnut
Inlägg: 299
Blev medlem: 18 okt 2007, 01:12
OS: Ubuntu
Utgåva: 16.04 Xenial Xerus LTS

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

Inlägg 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.
Skriv svar

Återgå till "Programmering och webbdesign"