2013-03-12 8 views
5

Disclaimer: Sono anni che non ho fatto alcun perl, quindi se sto chiedendo/dicendo qualcosa di stupido per favore correggimi.Visualizza variabili Perl come byte/bit

È possibile visualizzare una rappresentazione byte/bit di una variabile perl? Cioè, se dico qualcosa di simile

my $foo = 'a'; 

che conosco (si pensi?) Il computer vede $foo come qualcosa di simile

0b1100010 

c'è un modo per ottenere perl per stampare la rappresentazione binaria di un variabile?

(non chiedere per qualsiasi scopo pratico, basta armeggiare intorno con un vecchio amico e cercando di capire più profondamente di quanto ho fatto nel 1997)

risposta

12

Certo, utilizzando unpack:

print unpack "B*", $foo; 

Esempio:

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

Le pagine perldoc per pack e perlpacktut danno una bella panoramica sulla conversione tra i diversi r epresentations.

+0

Ho appena realizzato, nel 2017 ha perl fuori dalla scatola ASCII conversione binaria. pulito! Non conosco un'altra lingua che abbia questo. – Dmitry

2

Il punto di partenza se si desidera che l'interno effettivo sia un documento denominato "perlguts". Sia perldoc perlguts o leggere qui: http://perldoc.perl.org/perlguts.html

+0

un'interessante domanda, ho seguito una nota su Devel :: Peek –

1

È possibile utilizzare ord di restituire il valore numerico di un personaggio, e printf con un formato %b per visualizzare tale valore in binario.

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

uscita

01100010 
2

Dopo aver visto il modo in cui Andy interpretato alla tua domanda, posso seguire dicendo che Devel::Peek ha una funzione Dump che può mostrare la rappresentazione interna di una variabile. Non lo porterà al livello binario, ma se quello che ti interessa è l'interno, potresti guardare a questo.

$ 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

E un altro modo:

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

uscita:

01100001.01100010.0110001 

(Il v bandiera è un Perl sola printf/funzione sprintf e funziona anche con formati numerici diversi b .)

Questo è diverso dal suggerimento di disimballaggio dove ci sono caratteri maggiori di "\xff": decomprimere restituirà solo gli 8 bit bassi (con un avvertimento), printf '%v...' mostrerà tutti i bit:

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