_  _   ,_
/^\/^\-/ @D
~(________/ PERL.LT
|L |L
L L
Straipsniai  Funkcijos 
Funkcijos/vec - patikrina ar nustato atitinkamus bitus string'e
  • vec EXPR,OFFSET,BITS

    Laiko stringą EXPR kaip bitų vektorių, padarytą iš elementų, kurių plotis BITS ir gražina elemento, aprašyto OFFSET reikšmę kaip neženklintą sveikąjį skaičių. BITS aprašo bitų skaičių, kuris rezervuotas kiekvienam elementui bitų vektoriuje. Tai turi būti dviejų laipsnis nuo 1 iki 32 (arba 64, jei platforma tai palaiko).

    Jei BITS yra 8, "elementai" sutampa su įvesties stringo baitais.

    Jei BITS yra 16 ar daugiau, įvesties stringo baitai yra sugrupuojami į gabaliukus, kuriu dydis BITS/8, ir kiekviena grupė yra paverčiama į skaičių kaip su pack()/unpack() su big-endian formatais n /N (ir analogiškai BITS==64). Žr. pack dėl detalių.

    Jei bitų yra 4 ar mažiau, stringas yra suskaidomas į baitus, tada kiekvieno baito bitai yra išskaidomi į 8/BITS grupes. Baito bitai yra sunumeruojami little-endian būdu, kaip kad 0x01 , 0x02 , 0x04 , 0x08 , 0x10 , 0x20 , 0x40 , 0x80 . Pvz., suskaidant vieną įvesties baitą chr(0x36) į dvi grupes duoda sąrašą (0x6, 0x3) ; suskaidant jį į 4 grupes duoda (0x2, 0x1, 0x3, 0x0) .

    vec taip pat gali priskirta. Šiuo atveju reikalingi skliausta išsireiškimui duoti teisingą pirmumą, kaip kad

        vec($image, $max_x * $x + $y, 8) = 3;

    Jei pasirinktas elementas yra stringo išorėje, gražinama reikšmė 0. Jei įrašoma į elementą nuo stringo pabaigos, Perl pirmiausia išplės stringą atitinkamai tiek nulinių baitų. Tai klaida mėginti išrašyti iš stringo pradžios (t.y. neigiamas OFFSET).

    Stringe neturėtų būti simbolių su reikšme > 255 (kas gali nutikti tik tuo atveju, jei naudojama UTF-8 koduotė). Jei taip nutinka, bus laikoma, kad kažkas, kas ne UTF-8 užkoduota. Kai vec buvo priskirta, kitos programos dalys taip pat laikys stringą nebe užkoduotą UTF-8. Kitais žodžiais tariant, jei turite tokių simbolių stringe, vec() operuos aktualiu baitų stringu, o ne konceptualių simbolių stringu.

    Stringais, sukuriamais vec taip pat gali būti manipuliuojama loginiais operatoriais |, & , ^, ir ~ . Šie operatoriai tars, kad bitų vektoriaus operacija yra reikalinga tiek operandams, tiek stringams. Žr. "Bitwise String Operators" perlop'e.

    Sekantis kodas sukurs ASCII string'ą, sakantį 'PerlPerlPerl' . Komentarai parodo stringą po kiekvieno žingsnio. Įsidėmėkite, kad šis kodas veikia taip pat ir big-endian ir little-endian kompiuteriuose.

        my $foo = '';
        vec($foo,  0, 32) = 0x5065726C;	# 'Perl'
        # $foo eq "Perl" eq "\x50\x65\x72\x6C", 32 bits
        print vec($foo, 0, 8);		# prints 80 == 0x50 == ord('P')
        vec($foo,  2, 16) = 0x5065;		# 'PerlPe'
        vec($foo,  3, 16) = 0x726C;		# 'PerlPerl'
        vec($foo,  8,  8) = 0x50;		# 'PerlPerlP'
        vec($foo,  9,  8) = 0x65;		# 'PerlPerlPe'
        vec($foo, 20,  4) = 2;		# 'PerlPerlPe'   . "\x02"
        vec($foo, 21,  4) = 7;		# 'PerlPerlPer'
                                            # 'r' is "\x72"
        vec($foo, 45,  2) = 3;		# 'PerlPerlPer'  . "\x0c"
        vec($foo, 93,  1) = 1;		# 'PerlPerlPer'  . "\x2c"
        vec($foo, 94,  1) = 1;		# 'PerlPerlPerl'
                                            # 'l' is "\x6c"

    Paversti bitų vektorių į stringą arba sąrašą 0 ir 1, naudokite:

        $bits = unpack("b*", $vector);
        @bits = split(//, unpack("b*", $vector));

    Jei žinote tikslų ilgį bitais, jis gali būti naudojamas vietoj * .

    Štai pavyzdys, iliustruojantys kaip bitai visi atsiduria savo vietoj:

        #!/usr/bin/perl -wl
        print <<'EOT';
                                          0         1         2         3
                           unpack("V",$_) 01234567890123456789012345678901
        ------------------------------------------------------------------
        EOT
        for $w (0..3) {
            $width = 2**$w;
            for ($shift=0; $shift < $width; ++$shift) {
                for ($off=0; $off < 32/$width; ++$off) {
                    $str = pack("B*", "0"x32);
                    $bits = (1<<$shift);
                    vec($str, $off, $width) = $bits;
                    $res = unpack("b*",$str);
                    $val = unpack("V", $str);
                    write;
                }
            }
        }
        format STDOUT =
        vec($_,@#,@#) = @<< == @######### @>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        $off, $width, $bits, $val, $res
        .
        __END__

    Nežiūrint į kompiuterio architektūrą, kurioje jis paleidžiamas, pavyzdys turėtų išvesti tokią lentelę:

                                          0         1         2         3
                           unpack("V",$_) 01234567890123456789012345678901
        ------------------------------------------------------------------
        vec($_, 0, 1) = 1   ==          1 10000000000000000000000000000000
        vec($_, 1, 1) = 1   ==          2 01000000000000000000000000000000
        vec($_, 2, 1) = 1   ==          4 00100000000000000000000000000000
        vec($_, 3, 1) = 1   ==          8 00010000000000000000000000000000
        vec($_, 4, 1) = 1   ==         16 00001000000000000000000000000000
        vec($_, 5, 1) = 1   ==         32 00000100000000000000000000000000
        vec($_, 6, 1) = 1   ==         64 00000010000000000000000000000000
        vec($_, 7, 1) = 1   ==        128 00000001000000000000000000000000
        vec($_, 8, 1) = 1   ==        256 00000000100000000000000000000000
        vec($_, 9, 1) = 1   ==        512 00000000010000000000000000000000
        vec($_,10, 1) = 1   ==       1024 00000000001000000000000000000000
        vec($_,11, 1) = 1   ==       2048 00000000000100000000000000000000
        vec($_,12, 1) = 1   ==       4096 00000000000010000000000000000000
        vec($_,13, 1) = 1   ==       8192 00000000000001000000000000000000
        vec($_,14, 1) = 1   ==      16384 00000000000000100000000000000000
        vec($_,15, 1) = 1   ==      32768 00000000000000010000000000000000
        vec($_,16, 1) = 1   ==      65536 00000000000000001000000000000000
        vec($_,17, 1) = 1   ==     131072 00000000000000000100000000000000
        vec($_,18, 1) = 1   ==     262144 00000000000000000010000000000000
        vec($_,19, 1) = 1   ==     524288 00000000000000000001000000000000
        vec($_,20, 1) = 1   ==    1048576 00000000000000000000100000000000
        vec($_,21, 1) = 1   ==    2097152 00000000000000000000010000000000
        vec($_,22, 1) = 1   ==    4194304 00000000000000000000001000000000
        vec($_,23, 1) = 1   ==    8388608 00000000000000000000000100000000
        vec($_,24, 1) = 1   ==   16777216 00000000000000000000000010000000
        vec($_,25, 1) = 1   ==   33554432 00000000000000000000000001000000
        vec($_,26, 1) = 1   ==   67108864 00000000000000000000000000100000
        vec($_,27, 1) = 1   ==  134217728 00000000000000000000000000010000
        vec($_,28, 1) = 1   ==  268435456 00000000000000000000000000001000
        vec($_,29, 1) = 1   ==  536870912 00000000000000000000000000000100
        vec($_,30, 1) = 1   == 1073741824 00000000000000000000000000000010
        vec($_,31, 1) = 1   == 2147483648 00000000000000000000000000000001
        vec($_, 0, 2) = 1   ==          1 10000000000000000000000000000000
        vec($_, 1, 2) = 1   ==          4 00100000000000000000000000000000
        vec($_, 2, 2) = 1   ==         16 00001000000000000000000000000000
        vec($_, 3, 2) = 1   ==         64 00000010000000000000000000000000
        vec($_, 4, 2) = 1   ==        256 00000000100000000000000000000000
        vec($_, 5, 2) = 1   ==       1024 00000000001000000000000000000000
        vec($_, 6, 2) = 1   ==       4096 00000000000010000000000000000000
        vec($_, 7, 2) = 1   ==      16384 00000000000000100000000000000000
        vec($_, 8, 2) = 1   ==      65536 00000000000000001000000000000000
        vec($_, 9, 2) = 1   ==     262144 00000000000000000010000000000000
        vec($_,10, 2) = 1   ==    1048576 00000000000000000000100000000000
        vec($_,11, 2) = 1   ==    4194304 00000000000000000000001000000000
        vec($_,12, 2) = 1   ==   16777216 00000000000000000000000010000000
        vec($_,13, 2) = 1   ==   67108864 00000000000000000000000000100000
        vec($_,14, 2) = 1   ==  268435456 00000000000000000000000000001000
        vec($_,15, 2) = 1   == 1073741824 00000000000000000000000000000010
        vec($_, 0, 2) = 2   ==          2 01000000000000000000000000000000
        vec($_, 1, 2) = 2   ==          8 00010000000000000000000000000000
        vec($_, 2, 2) = 2   ==         32 00000100000000000000000000000000
        vec($_, 3, 2) = 2   ==        128 00000001000000000000000000000000
        vec($_, 4, 2) = 2   ==        512 00000000010000000000000000000000
        vec($_, 5, 2) = 2   ==       2048 00000000000100000000000000000000
        vec($_, 6, 2) = 2   ==       8192 00000000000001000000000000000000
        vec($_, 7, 2) = 2   ==      32768 00000000000000010000000000000000
        vec($_, 8, 2) = 2   ==     131072 00000000000000000100000000000000
        vec($_, 9, 2) = 2   ==     524288 00000000000000000001000000000000
        vec($_,10, 2) = 2   ==    2097152 00000000000000000000010000000000
        vec($_,11, 2) = 2   ==    8388608 00000000000000000000000100000000
        vec($_,12, 2) = 2   ==   33554432 00000000000000000000000001000000
        vec($_,13, 2) = 2   ==  134217728 00000000000000000000000000010000
        vec($_,14, 2) = 2   ==  536870912 00000000000000000000000000000100
        vec($_,15, 2) = 2   == 2147483648 00000000000000000000000000000001
        vec($_, 0, 4) = 1   ==          1 10000000000000000000000000000000
        vec($_, 1, 4) = 1   ==         16 00001000000000000000000000000000
        vec($_, 2, 4) = 1   ==        256 00000000100000000000000000000000
        vec($_, 3, 4) = 1   ==       4096 00000000000010000000000000000000
        vec($_, 4, 4) = 1   ==      65536 00000000000000001000000000000000
        vec($_, 5, 4) = 1   ==    1048576 00000000000000000000100000000000
        vec($_, 6, 4) = 1   ==   16777216 00000000000000000000000010000000
        vec($_, 7, 4) = 1   ==  268435456 00000000000000000000000000001000
        vec($_, 0, 4) = 2   ==          2 01000000000000000000000000000000
        vec($_, 1, 4) = 2   ==         32 00000100000000000000000000000000
        vec($_, 2, 4) = 2   ==        512 00000000010000000000000000000000
        vec($_, 3, 4) = 2   ==       8192 00000000000001000000000000000000
        vec($_, 4, 4) = 2   ==     131072 00000000000000000100000000000000
        vec($_, 5, 4) = 2   ==    2097152 00000000000000000000010000000000
        vec($_, 6, 4) = 2   ==   33554432 00000000000000000000000001000000
        vec($_, 7, 4) = 2   ==  536870912 00000000000000000000000000000100
        vec($_, 0, 4) = 4   ==          4 00100000000000000000000000000000
        vec($_, 1, 4) = 4   ==         64 00000010000000000000000000000000
        vec($_, 2, 4) = 4   ==       1024 00000000001000000000000000000000
        vec($_, 3, 4) = 4   ==      16384 00000000000000100000000000000000
        vec($_, 4, 4) = 4   ==     262144 00000000000000000010000000000000
        vec($_, 5, 4) = 4   ==    4194304 00000000000000000000001000000000
        vec($_, 6, 4) = 4   ==   67108864 00000000000000000000000000100000
        vec($_, 7, 4) = 4   == 1073741824 00000000000000000000000000000010
        vec($_, 0, 4) = 8   ==          8 00010000000000000000000000000000
        vec($_, 1, 4) = 8   ==        128 00000001000000000000000000000000
        vec($_, 2, 4) = 8   ==       2048 00000000000100000000000000000000
        vec($_, 3, 4) = 8   ==      32768 00000000000000010000000000000000
        vec($_, 4, 4) = 8   ==     524288 00000000000000000001000000000000
        vec($_, 5, 4) = 8   ==    8388608 00000000000000000000000100000000
        vec($_, 6, 4) = 8   ==  134217728 00000000000000000000000000010000
        vec($_, 7, 4) = 8   == 2147483648 00000000000000000000000000000001
        vec($_, 0, 8) = 1   ==          1 10000000000000000000000000000000
        vec($_, 1, 8) = 1   ==        256 00000000100000000000000000000000
        vec($_, 2, 8) = 1   ==      65536 00000000000000001000000000000000
        vec($_, 3, 8) = 1   ==   16777216 00000000000000000000000010000000
        vec($_, 0, 8) = 2   ==          2 01000000000000000000000000000000
        vec($_, 1, 8) = 2   ==        512 00000000010000000000000000000000
        vec($_, 2, 8) = 2   ==     131072 00000000000000000100000000000000
        vec($_, 3, 8) = 2   ==   33554432 00000000000000000000000001000000
        vec($_, 0, 8) = 4   ==          4 00100000000000000000000000000000
        vec($_, 1, 8) = 4   ==       1024 00000000001000000000000000000000
        vec($_, 2, 8) = 4   ==     262144 00000000000000000010000000000000
        vec($_, 3, 8) = 4   ==   67108864 00000000000000000000000000100000
        vec($_, 0, 8) = 8   ==          8 00010000000000000000000000000000
        vec($_, 1, 8) = 8   ==       2048 00000000000100000000000000000000
        vec($_, 2, 8) = 8   ==     524288 00000000000000000001000000000000
        vec($_, 3, 8) = 8   ==  134217728 00000000000000000000000000010000
        vec($_, 0, 8) = 16  ==         16 00001000000000000000000000000000
        vec($_, 1, 8) = 16  ==       4096 00000000000010000000000000000000
        vec($_, 2, 8) = 16  ==    1048576 00000000000000000000100000000000
        vec($_, 3, 8) = 16  ==  268435456 00000000000000000000000000001000
        vec($_, 0, 8) = 32  ==         32 00000100000000000000000000000000
        vec($_, 1, 8) = 32  ==       8192 00000000000001000000000000000000
        vec($_, 2, 8) = 32  ==    2097152 00000000000000000000010000000000
        vec($_, 3, 8) = 32  ==  536870912 00000000000000000000000000000100
        vec($_, 0, 8) = 64  ==         64 00000010000000000000000000000000
        vec($_, 1, 8) = 64  ==      16384 00000000000000100000000000000000
        vec($_, 2, 8) = 64  ==    4194304 00000000000000000000001000000000
        vec($_, 3, 8) = 64  == 1073741824 00000000000000000000000000000010
        vec($_, 0, 8) = 128 ==        128 00000001000000000000000000000000
        vec($_, 1, 8) = 128 ==      32768 00000000000000010000000000000000
        vec($_, 2, 8) = 128 ==    8388608 00000000000000000000000100000000
        vec($_, 3, 8) = 128 == 2147483648 00000000000000000000000000000001
algirdas@perl.lt 2005.04.11 - $dabar