2013-03-12 11 views
5

免責事項:私はperlを行って以来、年を重ねています。Perl変数をバイト/ビットで表示

perl変数のバイト/ビット表現を表示できますか?それ私が(と思う?)コンピュータが

0b1100010 

のようなものとして$fooを見て何か

my $foo = 'a'; 

のように私は知っていると言うならば、のバイナリ表現をプリントアウトするためのperlを取得する方法がありますされます変数?

unpackを使用して、

答えて

12

確かに(単に古い友人の周りいじり、より深く、私は1997年にやったよりも、それを理解しようとすると、任意の実用的な目的のために求めていない):

print unpack "B*", $foo; 

例: packperlpacktutため

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

はperldocページが異なるRとの間の変換についての素敵な概観を与えます陳述。

+0

:のみ(警告)8つの下位ビットが返される解凍、printf '%v...'は、すべてのビットを表示します。すっきり!私はそれを持っている別の言語を知らない。 – Dmitry

2

実際の内部構造が必要な場合は、 "perlguts"というドキュメントがあります。どちらのperldoc perlgutsは、ここでそれを読むか:あなたはバイナリにその値を表示するには、%b形式で数字の値、およびprintfを返すためにordを使用することができますhttp://perldoc.perl.org/perlguts.html

+0

興味深い質問がありますが、私はDevel :: Peek –

1

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

出力

01100010 
2

アンディはあなたの質問を解釈する方法を見た後、私はDevel::Peekは、変数の内部表現を表示することができDump機能を持っていると言ってフォローアップすることができます。バイナリレベルにはなりませんが、興味のあるものが内部であれば、これを見ることができます。

$ 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

そして、もう一つの方法:

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

出力:

01100001.01100010.0110001 

(Vフラグはperlの専用のprintf/sprintfの機能であり、またb以外の数値書式で動作します。

これは、0より大きい文字がある解凍の提案とは異なります:私はちょうどバイナリ変換にボックスASCII外有する2017 perlで、実現

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