Erlang 21 - 4. Bit Syntax

4 बिट सिंटेक्स




erlang

4 बिट सिंटेक्स

४.१ परिचय

बिट सिंटैक्स के लिए पूर्ण विनिर्देश Reference Manual में प्रकट होता है।

एरलंग में, एक बिन का उपयोग बायनेरिज़ के निर्माण और बाइनरी पैटर्न के मिलान के लिए किया जाता है। निम्नलिखित सिंटैक्स के साथ एक बिन लिखा जाता है:

<<E1, E2, ... En>>

एक बिन बिट्स या बाइट्स का एक निम्न-स्तरीय अनुक्रम है। बिन का उद्देश्य बायनेरिज़ के निर्माण को सक्षम करना है:

Bin = <<E1, E2, ... En>>

सभी तत्वों को बाध्य होना चाहिए। या एक बाइनरी मैच:

<<E1, E2, ... En>> = Bin 

यहां, बाउंड बाध्य है और तत्व बाध्य या अनबाउंड हैं, जैसे कि किसी भी मैच में।

एक बिन को बाइट्स की एक पूरी संख्या से युक्त करने की आवश्यकता नहीं है।

एक बिटस्ट्रिंग शून्य या अधिक बिट्स का एक अनुक्रम है, जहां बिट्स की संख्या 8 से विभाज्य होने की आवश्यकता नहीं है। यदि बिट्स की संख्या 8 से विभाज्य है, तो बिटस्ट्रिंग भी एक द्विआधारी है।

प्रत्येक तत्व बिटस्ट्रिंग के एक निश्चित खंड को निर्दिष्ट करता है। एक खंड बाइनरी के सन्निहित बिट्स का एक सेट है (जरूरी नहीं कि एक बाइट सीमा पर)। पहला तत्व प्रारंभिक खंड को निर्दिष्ट करता है, दूसरा तत्व निम्नलिखित खंड को निर्दिष्ट करता है, और इसी तरह।

निम्नलिखित उदाहरण बताते हैं कि कैसे बायनेरिज़ का निर्माण किया जाता है, या मिलान किया जाता है, और तत्वों और पूंछ को कैसे निर्दिष्ट किया जाता है।

उदाहरण

उदाहरण 1: एक बाइनरी का निर्माण स्थिरांक या स्ट्रिंग शाब्दिक के सेट से किया जा सकता है:

Bin11 = <<1, 17, 42>>,
Bin12 = <<"abc">>

यह निम्न मूल्यांकन के साथ आकार 3 के दो बायनेरिज़ देता है:

  • binary_to_list(Bin11) [1, 17, 42] मूल्यांकन करता है।
  • binary_to_list(Bin12) [97, 98, 99] मूल्यांकन करता है।

उदाहरण 2: इसी प्रकार, एक बाइनरी का निर्माण बाध्य चर के सेट से किया जा सकता है:

A = 1, B = 17, C = 42,
Bin2 = <<A, B, C:16>>

यह आकार का एक द्विआधारी देता है। यहां, Bin2 2 के 16-बिट खंड को निर्दिष्ट करने के लिए चर C लिए एक आकार अभिव्यक्ति का उपयोग किया जाता है।

binary_to_list(Bin2) [1, 17, 00, 42] मूल्यांकन करता है।

उदाहरण 3: एक बिन का उपयोग मिलान के लिए भी किया जा सकता है। D , E , और F अनबाउंड वैरिएबल हैं, और Bin2 बाध्य है, उदाहरण 2 में:

<<D:16, E, F/binary>> = Bin2

यह D = 273 , E = 00 , और F आकार के एक बाइनरी 1: binary_to_list(F) = [42] बांधता है।

उदाहरण 4: निम्नलिखित मिलान का अधिक विस्तृत उदाहरण है। यहाँ, Dgram IP प्रोटोकॉल संस्करण के IP डेटाग्राम के लगातार बाइट्स के लिए बाध्य है। महत्वाकांक्षा हेडर और डेटाग्राम के डेटा को निकालने के लिए है:

-define(IP_VERSION, 4).
-define(IP_MIN_HDR_LEN, 5).

DgramSize = byte_size(Dgram),
case Dgram of 
    <<?IP_VERSION:4, HLen:4, SrvcType:8, TotLen:16, 
      ID:16, Flgs:3, FragOff:13,
      TTL:8, Proto:8, HdrChkSum:16,
      SrcIP:32,
      DestIP:32, RestDgram/binary>> when HLen>=5, 4*HLen=<DgramSize ->
        OptsLen = 4*(HLen - ?IP_MIN_HDR_LEN),
        <<Opts:OptsLen/binary,Data/binary>> = RestDgram,
    ...
end.

यहाँ, Opts वैरिएबल से संबंधित सेगमेंट में एक प्रकार का संशोधक होता है , जो यह निर्दिष्ट करता है कि Opts एक बाइनरी से बाँधना है। अन्य सभी चरों में अहस्ताक्षरित पूर्णांक के बराबर डिफ़ॉल्ट प्रकार होता है।

IP डेटाग्राम हैडर वैरिएबल लंबाई का है। इस लंबाई को 32-बिट शब्दों की संख्या में मापा जाता है और इसे HLen अनुरूप खंड में दिया जाता है। HLen का न्यूनतम मूल्य है 5. यह HLen का वह खंड है जो परिवर्तनशील है, इसलिए यदि HLen 5 के बराबर है, तो HLen एक खाली बाइनरी बन जाता है।

टेल वैरिएबल RestDgram और Data बायनेरिज़ को बांधते हैं, जैसा कि सभी टेल वैरिएबल करते हैं। दोनों खाली बायनेरिज़ को बांध सकते हैं।

यदि निम्न में से एक होता है, तो Dgram का मैच विफल हो जाता है:

  • Dgram का पहला 4-बिट खंड 4 के बराबर नहीं है।
  • HLen 5 से कम है।
  • Dgram का आकार 4*HLen से कम है।

४.२ लेक्सिकल नोट

ध्यान दें कि " B=<<1>> " की व्याख्या " B=<<1>> " के रूप में की जाएगी, जो एक वाक्यविन्यास त्रुटि है। अभिव्यक्ति लिखने का सही तरीका है: B = <<1>>

4.3 खंड

प्रत्येक खंड में निम्नलिखित सामान्य वाक्यविन्यास हैं:

Value:Size/TypeSpecifierList

Size या TypeSpecifier या दोनों को छोड़ा जा सकता है। इस प्रकार, निम्नलिखित प्रकारों की अनुमति है:

  • Value
  • Value:Size
  • Value/TypeSpecifierList

डिफ़ॉल्ट मान का उपयोग तब किया जाता है जब विनिर्देश गायब होते हैं। डिफ़ॉल्ट मान डिफ़ॉल्ट में वर्णित हैं।

बाइनरी कंस्ट्रक्शन में इस्तेमाल होने पर Value पार्ट कोई भी एक्सप्रेशन होता है। बाइनरी मिलान में उपयोग किया जाता है, Value भाग एक शाब्दिक या एक चर होना चाहिए। Value भाग के बारे में अधिक जानकारी के लिए, Constructing Binaries and Bitstrings और Matching Binaries Constructing Binaries and Bitstrings देखें।

TypeSpecifierList (बाद में वर्णित) में इकाई द्वारा गुणा किए गए खंड का Size खंड के लिए बिट्स की संख्या देता है। निर्माण में, Size कोई भी अभिव्यक्ति है जो पूर्णांक का मूल्यांकन करता है। मिलान में, Size एक स्थिर अभिव्यक्ति या एक चर होना चाहिए।

TypeSpecifierList हाइफ़न द्वारा अलग किए गए प्रकार के TypeSpecifierList की एक सूची है।

प्रकार
सबसे अधिक उपयोग किए जाने वाले प्रकार integer , float और binary । संपूर्ण विवरण के लिए Bit Syntax Expressions in the Reference Manual देखें।
Signedness
signed विनिर्देश या तो signed या unsigned हो सकते हैं। ध्यान दें कि हस्ताक्षर केवल मिलान के लिए मायने रखते हैं।
endianness
एंडियननेस विनिर्देश या तो big , little या native हो सकता native । नेटिव-एंडियन का मतलब है कि एंडियन को लोड समय पर हल किया जाता है, या तो बड़े-एंडियन या छोटे-एंडियन होने के लिए, यह सीपीयू के लिए "देशी" पर निर्भर करता है कि एरलांग मशीन को चलाया जाता है।
इकाई
यूनिट का आकार इकाई के रूप में दिया गया unit:IntegerLiteral । अनुमत सीमा 1-256 है। यह खंड के प्रभावी आकार को देने के लिए Size विनिर्देशक द्वारा गुणा किया जाता है। इकाई का आकार बिना आकार के बाइनरी सेगमेंट के लिए संरेखण को निर्दिष्ट करता है।

उदाहरण:

X:4/little-signed-integer-unit:8

इस तत्व का कुल आकार 4 * 8 = 32 बिट्स है, और इसमें अल्प-एंडियन क्रम में एक हस्ताक्षरित पूर्णांक है।

४.४ दोष

एक खंड के लिए डिफ़ॉल्ट प्रकार पूर्णांक है। डिफ़ॉल्ट प्रकार मूल्य पर निर्भर नहीं करता है, भले ही मूल्य एक शाब्दिक हो। उदाहरण के लिए, <<3.14>> में डिफ़ॉल्ट प्रकार पूर्णांक है, फ्लोट नहीं।

डिफ़ॉल्ट Size प्रकार पर निर्भर करता है। पूर्णांक के लिए यह 8. है। फ्लोट के लिए यह 64 है। बाइनरी के लिए यह सभी बाइनरी है। मिलान में, यह डिफ़ॉल्ट मान केवल अंतिम तत्व के लिए मान्य है। मिलान में अन्य सभी बाइनरी तत्वों का आकार विनिर्देश होना चाहिए।

डिफ़ॉल्ट इकाई प्रकार पर निर्भर करती है। integer , float , और bitstring यह 1. बाइनरी के लिए 8 है।

डिफॉल्ट सिग्नेचर unsigned

डिफ़ॉल्ट धीरज big

4.5 बायनेरिज़ और बिटस्ट्रिंग्स का निर्माण

यह अनुभाग बिट सिंटैक्स का उपयोग करके बायनेरिज़ के निर्माण के नियमों का वर्णन करता है। सूचियों या ट्यूपल्स के निर्माण के विपरीत, एक बाइनरी का निर्माण एक badarg अपवाद के साथ विफल हो सकता है।

एक बाइनरी में शून्य या अधिक सेगमेंट का निर्माण किया जा सकता है। अभिव्यक्ति <<>> एक शून्य लंबाई बाइनरी का निर्माण करता है।

एक बाइनरी में प्रत्येक खंड में शून्य या अधिक बिट्स हो सकते हैं। प्रकार integer और float अलग-अलग खंडों के लिए कोई संरेखण नियम नहीं हैं। आकार के बिना बायनेरिज़ और बिटस्ट्रिंग्स के लिए, यूनिट संरेखण को निर्दिष्ट करता है। चूंकि binary प्रकार के लिए डिफ़ॉल्ट संरेखण 8 है, एक बाइनरी सेगमेंट का आकार 8 बिट्स का एक से अधिक होना चाहिए, अर्थात, केवल पूरे बाइट्स।

उदाहरण:

<<Bin/binary,Bitstring/bitstring>>

चर Bin में बाइट्स की एक पूरी संख्या होनी चाहिए, क्योंकि binary प्रकार unit:8 चूक unit:8 । एक badarg अपवाद उत्पन्न होता है यदि Bin मिलकर बनता है, उदाहरण के लिए, 17 बिट्स।

Bitstring चर में किसी भी संख्या में बिट्स शामिल हो सकते हैं, उदाहरण के लिए, 0, 1, 8, 11, 17, 42, और इसी तरह। ऐसा इसलिए है क्योंकि बिटस्ट्रिंग्स के लिए डिफ़ॉल्ट unit 1 है।

स्पष्टता के लिए, बायनेरिज़ के लिए इकाई आकार को नहीं बदलने की सिफारिश की गई है। इसके बजाय, binary उपयोग करें जब आपको बिट संरेखण और bitstring की आवश्यकता bitstring जब आपको बिट संरेखण की आवश्यकता होती है।

निम्नलिखित उदाहरण सफलतापूर्वक 7 बिट्स के बिटस्ट्रिंग का निर्माण करता है, बशर्ते कि सभी X और Y पूर्णांक हैं:

<<X:1,Y:6>>

जैसा कि पहले उल्लेख किया गया है, खंडों में निम्नलिखित सामान्य वाक्यविन्यास हैं:

Value:Size/TypeSpecifierList

बायनेरिज़ का निर्माण करते समय, Value और Size किसी भी एरलंग अभिव्यक्ति हो सकते हैं। हालाँकि, वाक्यात्मक कारणों के लिए, Value और Size दोनों को कोष्ठक में संलग्न किया जाना चाहिए, यदि अभिव्यक्ति में एकल शाब्दिक या चर से अधिक कुछ भी हो। निम्नलिखित एक संकलक वाक्यविन्यास त्रुटि देता है:

<<X+1:8>>

संकलक द्वारा स्वीकार किए जाने के लिए इस अभिव्यक्ति को निम्नलिखित में फिर से लिखना चाहिए:

<<(X+1):8>>

जिसमें लिटरल स्ट्रिंग्स भी शामिल है

एक तत्व के बजाय एक शाब्दिक स्ट्रिंग लिखा जा सकता है:

<<"hello">>

यह निम्नलिखित के लिए वाक्य रचना चीनी है:

<<$h,$e,$l,$l,$o>>

4.6 मैचिंग बायनेरी

यह अनुभाग बिट सिंटैक्स का उपयोग करके बायनेरिज़ के मिलान के नियमों का वर्णन करता है।

बाइनरी पैटर्न में शून्य या अधिक सेगमेंट हो सकते हैं। एक बाइनरी पैटर्न हो सकता है जहाँ भी पैटर्न की अनुमति दी जाती है, जिसमें अन्य पैटर्न शामिल हैं। बाइनरी पैटर्न को नेस्टेड नहीं किया जा सकता है। पैटर्न <<>> एक शून्य लंबाई बाइनरी से मेल खाता है।

एक बाइनरी में प्रत्येक खंड में शून्य या अधिक बिट्स हो सकते हैं। प्रकार के binary एक खंड का आकार 8 से समान रूप से विभाज्य होना चाहिए (या इकाई के आकार से विभाज्य है, यदि इकाई का आकार बदल दिया गया है)। प्रकार के bitstring एक खंड का आकार पर कोई प्रतिबंध नहीं है।

जैसा कि पहले उल्लेख किया गया है, खंडों में निम्नलिखित सामान्य वाक्यविन्यास हैं:

Value:Size/TypeSpecifierList

Value मिलान करते समय, मान या तो एक चर या पूर्णांक या एक अस्थायी बिंदु शाब्दिक होना चाहिए। अभिव्यक्ति की अनुमति नहीं है।

Size एक पूर्णांक शाब्दिक होना चाहिए, या एक पहले से बाध्य चर। निम्नलिखित की अनुमति नहीं है:

foo(N, <<X:N,T/binary>>) ->
   {X,T}.

N की दो घटनाएँ संबंधित नहीं हैं। कंपाइलर शिकायत करेगा कि आकार क्षेत्र में N अनबाउंड है।

इस उदाहरण को लिखने का सही तरीका इस प्रकार है:

foo(N, Bin) ->
   <<X:N,T/binary>> = Bin,
   {X,T}.

बाकी बाइनरी या बिटस्ट्रिंग प्राप्त करना

बाइनरी के बाकी हिस्सों से मिलान करने के लिए, बिना आकार के एक बाइनरी फ़ील्ड निर्दिष्ट करें:

foo(<<A:8,Rest/binary>>) ->

पूंछ का आकार 8 से समान रूप से विभाज्य होना चाहिए।

एक बिटस्ट्रिंग के बाकी हिस्सों से मिलान करने के लिए, बिना आकार के एक फ़ील्ड निर्दिष्ट करें:

foo(<<A:8,Rest/bitstring>>) ->

पूंछ में बिट्स की संख्या पर कोई प्रतिबंध नहीं है।

4.7 एक बाइनरी में जोड़ना

एक प्रभावी तरीके से एक द्विआधारी में आवेदन निम्नानुसार किया जा सकता है:

triples_to_bin(T) ->
    triples_to_bin(T, <<>>).

triples_to_bin([{X,Y,Z} | T], Acc) ->
    triples_to_bin(T, <<Acc/binary,X:32,Y:32,Z:32>>);
triples_to_bin([], Acc) -> 
    Acc.