2013-03-12 14 views
5

Uwaga: Minęły lata, odkąd zrobiłem jakikolwiek perl, więc jeśli pytam/mówię coś głupiego, popraw mnie.Wyświetl zmienne Perla jako bajty/bitów

Czy można wyświetlić bajt/bitową reprezentację zmiennej perl? Oznacza to, że jeśli powiem coś

my $foo = 'a'; 

wiem (myślę?) Komputer widzi $foo jako coś podobnego

0b1100010 

Czy istnieje sposób, aby uzyskać Perl wydrukować binarnej reprezentacji zmienna?

(nie pytając o praktycznego celu, po prostu majstrować wokół z starego przyjaciela i stara się go zrozumieć głębiej niż ja w 1997 roku)

Odpowiedz

12

Jasne, używając unpack:

print unpack "B*", $foo; 

Przykład:

% perl -e 'print unpack "B*", "bar";' 
011000100110000101110010 

Strony perldoc do pack i perlpacktut dają miły przegląd konwersji r pomiędzy poszczególnymi epresentations.

+0

Właśnie uświadomiłem sobie, w 2017 perla z ASCII skrzynki do konwersji binarnej. schludny! Nie znam innego języka, który to ma. – Dmitry

2

Miejscem rozpoczęcia, jeśli chcesz, że rzeczywiste wnętrze jest dokumentem o nazwie "perlguts". Albo perldoc perlguts lub przeczytać tutaj: http://perldoc.perl.org/perlguts.html

+0

ciekawe podejście do pytania, mam śledzony z notatką na Devel :: Peek –

1

Można użyć ord zwraca wartość liczbową znak i printf z formacie %b wyświetlić tę wartość w formacie binarnym.

print "%08b\n”, ord 'a' 

wyjście

01100010 
2

Po obejrzeniu sposób, że Andy interpretować swoje pytanie, mogę śledzić mówiąc, że Devel::Peek ma Dump funkcję, która może pokazać wewnętrzną reprezentację zmiennej. Nie przeniesie go na poziom binarny, ale jeśli to, co cię interesuje, to elementy wewnętrzne, możesz na to spojrzeć.

$ perl -MDevel::Peek -e 'my $foo="a";Dump $foo'; 
SV = PV(0x7fa8a3004e78) at 0x7fa8a3031150 
    REFCNT = 1 
    FLAGS = (PADMY,POK,pPOK) 
    PV = 0x7fa8a2c06190 "a"\0 
    CUR = 1 
    LEN = 16 

$ perl -MDevel::Peek -e 'my %bar=(x=>"y",a=>"b");Dump \%bar' 
SV = IV(0x7fbc5182d6e8) at 0x7fbc5182d6f0 
    REFCNT = 1 
    FLAGS = (TEMP,ROK) 
    RV = 0x7fbc51831168 
    SV = PVHV(0x7fbc5180c268) at 0x7fbc51831168 
    REFCNT = 2 
    FLAGS = (PADMY,SHAREKEYS) 
    ARRAY = 0x7fbc5140f9f0 (0:6, 1:2) 
    hash quality = 125.0% 
    KEYS = 2 
    FILL = 2 
    MAX = 7 
    RITER = -1 
    EITER = 0x0 
    Elt "a" HASH = 0xca2e9442 
    SV = PV(0x7fbc51804f78) at 0x7fbc51807340 
     REFCNT = 1 
     FLAGS = (POK,pPOK) 
     PV = 0x7fbc5140fa60 "b"\0 
     CUR = 1 
     LEN = 16 
    Elt "x" HASH = 0x9303a5e5 
    SV = PV(0x7fbc51804e78) at 0x7fbc518070d0 
     REFCNT = 1 
     FLAGS = (POK,pPOK) 
     PV = 0x7fbc514061a0 "y"\0 
     CUR = 1 
     LEN = 16 
2

I jeszcze jeden sposób:

printf "%v08b\n", 'abc'; 

wyjściowa:

01100001.01100010.0110001 

(Flaga V jest Perl tylko printf/funkcja sprintf, a także współpracuje z formatów liczbowych innych niż b .)

Różni się to od rozpakowywania sugestii, gdzie występują znaki większe niż "\xff": rozpakować powróci tylko 8 bitów niskie (z ostrzeżeniem), printf '%v...' pokaże wszystkie bity:

$ perl -we'printf "%vX\n", "\cA\13P\x{1337}"' 
1.B.50.1337