5

免責事項:私がperlを実行してから何年も経っていますので、私が愚かなことを尋ねたり言ったりしている場合は、私を訂正してください。

Perl変数のバイト/ビット表現を表示することは可能ですか?つまり、私が次のようなことを言うと

my $foo = 'a';

$foo私はコンピュータが次のようなものとして見ていることを知っています(考えますか?)

0b1100010

perlに変数のバイナリ表現を出力させる方法はありますか?

(実用的な目的を求めるのではなく、古くからの友人をいじくり回して、1997年よりも深く理解しようとしているだけです)

4

5 に答える 5

12

確かに、解凍を使用します:

print unpack "B*", $foo;

例:

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

packperlpacktutのperldocページには、さまざまな表現間の変換に関する概要が記載されています。

于 2013-03-12T21:42:02.910 に答える
2

実際の内部が必要な場合に開始する場所は、「perlguts」と呼ばれるドキュメントです。どちらかperldoc perlguts、またはここでそれを読んでください:http: //perldoc.perl.org/perlguts.html

于 2013-03-12T21:59:30.797 に答える
2

Andyがあなたの質問をどのように解釈したかを見た後、 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
于 2013-03-12T23:05:44.380 に答える
2

そしてもう1つの方法:

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

出力:

01100001.01100010.0110001

(vフラグはperlのみのprintf / sprintf機能であり、以外の数値形式でも機能しますb。)

これは、以下の文字が含まれるアンパックの提案とは異なります"\xff"。アンパックは下位8ビットのみを返し(警告付き)、printf '%v...'すべてのビットを表示します。

$ perl -we'printf "%vX\n", "\cA\13P\x{1337}"'
1.B.50.1337
于 2013-03-13T01:59:01.350 に答える
1

を使用ordして文字の数値を返し、その値を2進数で表示printfする%b形式で使用できます。

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

出力

01100010
于 2013-03-12T23:04:11.507 に答える