2013-03-12 8 views
5

अस्वीकरण: पेरू वैरिएबल देखें क्योंकि मैंने कोई पेर्ल किया है, इसलिए यदि मैं कुछ बेवकूफ कह रहा/कह रहा हूं तो कृपया मुझे सही करें।बाइट्स/बिट्स

क्या यह एक perl चर के बाइट/बिट प्रतिनिधित्व को देखना संभव है? यही कारण है, अगर मैं कहूँ की तरह

my $foo = 'a'; 

कुछ मैं पता (लगता है?) कंप्यूटर की तरह

0b1100010 

कुछ के रूप में देखता है $foo वहाँ एक रास्ता बाहर एक की बाइनरी प्रतिनिधित्व मुद्रित करने के लिए पर्ल प्राप्त करने के लिए है चर?

(किसी भी व्यावहारिक प्रयोजन के लिए पूछ नहीं सिर्फ एक पुराने दोस्त के साथ चारों ओर संवारता और अधिक गहराई से इसे समझने की तुलना में मैं 1997 में किया था की कोशिश कर रहा,),

उत्तर

12

ज़रूर unpack का उपयोग कर:

print unpack "B*", $foo; 

उदाहरण:

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

pack और perlpacktut के लिए perldoc पृष्ठों के विभिन्न आर के बीच परिवर्तित करने के बारे में एक अच्छा सिंहावलोकन देने के epresentations।

+0

मैं सिर्फ महसूस किया, 2017 पर्ल में द्विआधारी रूपांतरण करने के लिए बॉक्स ascii से बाहर है: खोल केवल 8 कम बिट्स वापस आ जाएगी (एक चेतावनी के साथ), printf '%v...' सभी बिट्स दिखाएगा। साफ! मुझे वह दूसरी भाषा नहीं है जिसमें वह है। – Dmitry

2

यदि आप वास्तविक आंतरिक चाहते हैं तो शुरू करने की जगह "पर्गट्स" नामक एक दस्तावेज़ है। या तो perldoc perlguts या इसे यहाँ पढ़ें: http://perldoc.perl.org/perlguts.html

+0

इस सवाल में एक दिलचस्प कदम है, मैंने डेवेल :: पीक पर एक नोट का पालन किया है –

1

आप ord उपयोग कर सकते हैं एक %b प्रारूप के साथ एक चरित्र के संख्यात्मक मान, और printf वापस जाने के लिए द्विआधारी में वह मान प्रदर्शित करने के लिए।

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 झंडा एक पर्ल केवल printf/sprintf सुविधा है और यह भी b के अलावा अन्य सांख्यिक स्वरूपों के साथ काम करता है ।)

यह अनपैक सुझाव से अलग है जहां 0 से अधिक वर्ण हैं:

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