Erlang 21 - 3. Getting Started

3 शुरू हो रहा है




erlang

3 शुरू हो रहा है

३.१ उदाहरण

निम्न उदाहरण Erlang ASN.1 संकलक को चलाने के लिए उपयोग की जाने वाली मूल कार्यक्षमता को दर्शाता है।

एक फ़ाइल बनाएँ जिसका नाम People.asn जिसमें निम्नलिखित हैं:

People DEFINITIONS AUTOMATIC TAGS ::=
BEGIN
  Person ::= SEQUENCE {
    name PrintableString,
    location INTEGER {home(0),field(1),roving(2)},
    age INTEGER OPTIONAL
  }
END      

यह फ़ाइल उपयोग करने से पहले संकलित होनी चाहिए। ASN.1 कंपाइलर जांचता है कि सिंटैक्स सही है और अमूर्त सिंटैक्स ट्री बनाने से पहले टेक्स्ट उचित ASN.1 कोड का प्रतिनिधित्व करता है। कोड-जनरेटर तब कोड उत्पन्न करने के लिए सार सिंटैक्स ट्री का उपयोग करता है।

उत्पन्न Erlang फ़ाइलों को वर्तमान निर्देशिका या विकल्प {outdir,Dir} साथ निर्दिष्ट निर्देशिका में रखा गया है।

निम्नलिखित दिखाता है कि एर्लैंग शेल से कंपाइलर को कैसे बुलाया जा सकता है:

1>asn1ct:compile("People", [ber]).
ok
2>      

उत्पन्न फ़ाइलों के बारे में जानकारी प्राप्त करने के लिए विकल्प verbose को जोड़ा जा सकता है:

2>asn1ct:compile("People", [ber,verbose]).
Erlang ASN.1 compiling "People.asn" 
--{generated,"People.asn1db"}--
--{generated,"People.hrl"}--
--{generated,"People.erl"}--
ok
3>      

ASN.1 मॉड्यूल People अब स्वीकार किए जाते हैं और सार वाक्यविन्यास ट्री People.asn1db फ़ाइल में सहेजा जाता है। उत्पन्न Erlang कोड Erlang संकलक का उपयोग करके संकलित किया गया है और Erlang रनटाइम सिस्टम में लोड किया गया है। अब मॉड्यूल People में encode/2 और decode/2 लिए एक एपीआई है, जिसे इस प्रकार कहा जाता है:
'People':encode(<Type name>, <Value>)
या
'People':decode(<Type name>, <Value>)

मान लें कि एक नेटवर्क अनुप्रयोग है जो ASN.1 परिभाषित प्रकार के Person को प्राप्त करता है, उसे संशोधित करता है, और उन्हें फिर से भेजता है:

receive
   {Port,{data,Bytes}} ->
       case 'People':decode('Person',Bytes) of
           {ok,P} ->
               {ok,Answer} = 'People':encode('Person',mk_answer(P)),
               Port ! {self(),{command,Answer}};
           {error,Reason} ->
               exit({error,Reason})
       end
    end,      

इस उदाहरण में, बाइट्स की एक श्रृंखला को एक बाहरी स्रोत से प्राप्त किया जाता है और बाइट्स को तब एक वैध एर्लैंग शब्द में डिकोड किया जाता है। यह 'People':decode('Person',Bytes) कॉल के साथ हासिल किया गया था, जिसने ASN.1 प्रकार के Person का एर्लांग मूल्य वापस कर दिया। तब एक उत्तर का निर्माण किया गया था और 'People':encode('Person',Answer) का उपयोग करके एन्कोड किया गया था, जो एक परिभाषित ASN.1 प्रकार का एक उदाहरण लेता है और इसे BER या प्रति एन्कोडिंग नियमों के अनुसार एक बाइनरी में बदल देता है।

एनकोडर और डिकोडर को शेल से भी चलाया जा सकता है:

2> Rockstar = {'Person',"Some Name",roving,50}.
{'Person',"Some Name",roving,50}
3> {ok,Bin} = 'People':encode('Person',Rockstar).
{ok,<<243,17,19,9,83,111,109,101,32,78,97,109,101,2,1,2,
      2,1,50>>}
4> {ok,Person} = 'People':decode('Person',Bin).
{ok,{'Person',"Some Name",roving,50}}
5>      

मॉड्यूल निर्भरता

यह सामान्य है कि ASN.1 मॉड्यूल एक अन्य ASN.1 मॉड्यूल से परिभाषित प्रकारों, मूल्यों और अन्य संस्थाओं को आयात करते हैं।

ASN.1 संकलक के पहले संस्करणों के लिए आवश्यक था कि आयात किए गए मॉड्यूल को उस मॉड्यूल से पहले संकलित किया जाए जो आयात किया गया था। जब ASN.1 मॉड्यूल पर निर्भरता थी, तो यह समस्या उत्पन्न हुई।

जब संकलक को आयात की जाने वाली इकाई का पता चलता है, तब संदर्भित मॉड्यूल को पार्स किया जाता है। संदर्भित मॉड्यूल के लिए कोई कोड उत्पन्न नहीं होता है। हालाँकि, संकलित मॉड्यूल इस बात पर निर्भर करते हैं कि संदर्भित मॉड्यूल भी संकलित हैं।

3.2 ASN.1 एप्लीकेशन यूजर इंटरफेस

ASN.1 आवेदन निम्नलिखित दो अलग-अलग उपयोगकर्ता इंटरफ़ेस प्रदान करता है:

  • मॉड्यूल asn1ct , जो संकलन-समय के कार्य (संकलक सहित) प्रदान करता है

  • मॉड्यूल asn1rt_nif , जो BER बैक एंड के लिए ASN.1 डिकोडर के लिए रनटाइम फ़ंक्शन प्रदान करता है

संकलन-समय और रनटाइम में इंटरफेस के इस विभाजन का कारण केवल रनटाइम मॉड्यूल ( asn1rt* ) को एक एम्बेडेड सिस्टम में लोड करना है।

संकलन-समय के कार्य

ASN.1 कंपाइलर को कमांड लाइन से सीधे erlc प्रोग्राम द्वारा शुरू किया जा सकता है। यह कमांड लाइन से कई ASN.1 फ़ाइलों का संकलन करते समय या मेकफाइल्स का उपयोग करते समय सुविधाजनक है। erlc कमांड का उपयोग ASN.1 कंपाइलर को शुरू करने के लिए कैसे किया जा सकता है, erlc कुछ उदाहरण:

erlc Person.asn
erlc -bper Person.asn
erlc -bber ../Example.asn
erlc -o ../asnfiles -I ../asnfiles -I /usr/local/standards/asn1 Person.asn

ASN.1 संकलक के लिए उपयोगी विकल्प:

-b[ber | per | uper]

एन्कोडिंग नियमों की पसंद। यदि छोड़ा गया है, तो ber डिफ़ॉल्ट है।

-o OutDirectory

उत्पन्न फ़ाइलों को कहाँ रखा जाए। डिफ़ॉल्ट वर्तमान निर्देशिका है।

-I IncludeDir

अन्य मॉड्यूल के संदर्भों को हल करने के लिए .asn1db फ़ाइलों और ASN.1 स्रोत चश्मे की खोज कहां करें। यदि खोज करने के लिए कई स्थान हैं, तो यह विकल्प कई बार दोहराया जा सकता है। संकलक पहले वर्तमान निर्देशिका को खोजता है।

+der

डीईआर एन्कोडिंग नियम। केवल विकल्प -ber का उपयोग करते समय।

+maps

रिकॉर्ड और SET प्रकार का प्रतिनिधित्व करने के लिए रिकॉर्ड के बजाय मानचित्र का उपयोग करें। कोई .hrl फाइलें जनरेट नहीं .hrl । अधिक जानकारी के Map representation for SEQUENCE and SET का सेक्शन Map representation for SEQUENCE and SET देखें।

+asn1config

यह कार्यक्षमता विकल्प ber साथ मिलकर काम करती है। यह विशेष डिकोड को सक्षम करता है, अनुभाग Specialized Decode देखें।

+undec_rest

एक बफ़र जो एक संदेश को डिकोड किया जा रहा है, उसमें बाइटिंग ट्रेल्स भी हो सकते हैं। यदि वे अनुगामी बाइट महत्वपूर्ण हैं, तो उन्हें ASN.1 विनिर्देश विकल्प +undec_rest साथ संकलित करके डीकोड किए गए मान के साथ वापस किया जा सकता है। डिकोडर से रिटर्न वैल्यू {ok,Value,Rest} जहां Rest एक बाइनरी है जिसमें ट्रेलिंग बाइट्स हैं।

+'Any Erlc Option'

किसी भी विकल्प को एरलांग कंपाइलर में जोड़ा जा सकता है जब उत्पन्न हुई एरलंग फ़ाइलों को संकलित किया जाता है। ASN.1 संकलक द्वारा पहचाने गए किसी भी विकल्प को Erlang संकलक को पास किया जाता है।

erlc संपूर्ण विवरण के लिए, ERTS संदर्भ मैनुअल देखें।

संकलक और अन्य संकलन-समय के कार्यों को एरलैंग शेल से भी शुरू किया जा सकता है। यहां प्राथमिक कार्यों का संक्षिप्त विवरण दिया गया है। प्रत्येक फ़ंक्शन के पूर्ण विवरण के लिए, ASN.1 Reference Manual में मॉड्यूल asn1ct देखें।

संकलक को asn1ct:compile/1 द्वारा शुरू किया asn1ct:compile/1 डिफ़ॉल्ट विकल्प के साथ asn1ct:compile/1 , या asn1ct:compile/2 यदि स्पष्ट विकल्प दिए गए हैं।

उदाहरण:

asn1ct:compile("H323-MESSAGES.asn1").      

यह बराबर है:

asn1ct:compile("H323-MESSAGES.asn1",[ber]).      

यदि प्रति एन्कोडिंग चाहता है:

asn1ct:compile("H323-MESSAGES.asn1",[per]).      

सामान्य सांकेतिक शब्दों में बदलना और डिकोड कार्यों को निम्नानुसार कहा जा सकता है:

'H323-MESSAGES':encode('SomeChoiceType',{call,<<"octetstring">>}).
'H323-MESSAGES':decode('SomeChoiceType',Bytes).      

रनटाइम फंक्शंस

जब ASN.1 विनिर्देश विकल्प ber साथ संकलित किया जाता है, तो asn1/priv_dir में asn1/priv_dir मॉड्यूल और asn1/priv_dir लाइब्रेरी रनटाइम पर आवश्यक होते हैं।

एक उत्पन्न मॉड्यूल में फ़ंक्शन info/0 को कॉल करके, आपको जानकारी मिलती है कि किस संकलक विकल्प का उपयोग किया गया था।

त्रुटियाँ

संकलन-समय पर पाई गई त्रुटियों को स्क्रीन पर लाइन नंबरों के साथ प्रदर्शित किया जाता है, यह दर्शाता है कि स्रोत फ़ाइल में संबंधित त्रुटि का पता लगाया गया था। यदि कोई त्रुटि नहीं मिलती है, तो एक Erlang ASN.1 मॉड्यूल बनाया जाता है।

रनटाइम एनकोडर और डिकोडर एक कैच के भीतर निष्पादित करते हैं और {ok, Data} या {error, {asn1, Description}} जहां Description {error, {asn1, Description}} टर्म होता है।

वर्तमान में, Description इस तरह दिखता है: {ErrorDescription, StackTrace} । अनुप्रयोग Description की सटीक सामग्री पर निर्भर नहीं होना चाहिए क्योंकि यह भविष्य में बदल सकता है।

3.3 मल्टी-फ़ाइल संकलन

बहु-फ़ाइल संकलन का उपयोग करने के विभिन्न कारण हैं:

  • उत्पन्न मॉड्यूल के लिए नाम चुनने के लिए, उदाहरण के लिए, क्योंकि आपको विभिन्न एन्कोडिंग नियमों के लिए एक ही चश्मा संकलित करने की आवश्यकता है।
  • आप केवल एक परिणामी मॉड्यूल चाहते हैं।

निर्दिष्ट करें कि कौन सा ASN.1 एक्सटेंशन .set.asn साथ एक मॉड्यूल में संकलन करने के लिए .set.asn । एक मॉड्यूल नाम चुनें और ASN.1 चश्मा के नाम प्रदान करें। उदाहरण के लिए, यदि आपके पास File1.asn , File2.asn , और File3.asn , तो आपका मॉड्यूल MyModule.set.asn इस प्रकार दिखता है:

File1.asn
File2.asn
File3.asn    

यदि आप निम्नलिखित के साथ संकलित करते हैं, तो परिणाम एक मर्ज किए गए मॉड्यूल MyModule.erl है जो तीन ASN.1 स्पेक्स से उत्पन्न कोड के साथ है:

~> erlc MyModule.set.asn    

3.4 टैग के बारे में टिप्पणी

टैग ASN.1 के सभी उपयोगकर्ताओं के लिए महत्वपूर्ण हुआ करता था, क्योंकि ASN.1 विनिर्देश के मान्य होने के लिए कुछ निर्माणों में मैन्युअल रूप से टैग जोड़ना आवश्यक था। एक पुरानी शैली के विनिर्देश का उदाहरण:

Tags DEFINITIONS ::=
BEGIN
  Afters ::= CHOICE { cheese [0] IA5String,
                      dessert [1] IA5String }
END 

टैग (वर्ग कोष्ठक में संख्या) के बिना ASN.1 संकलक ने फ़ाइल संकलित करने से इनकार कर दिया।

1994 में वैश्विक टैगिंग मोड AUTOMATIC TAGS शुरू किया गया था। मॉड्यूल शीर्षक में AUTOMATIC TAGS लगाकर, ASN.1 संकलक स्वचालित रूप से जब जरूरत टैग जोड़ता है। निम्नलिखित AUTOMATIC TAGS मोड में एक ही विनिर्देश है:

Tags DEFINITIONS AUTOMATIC TAGS ::=
BEGIN
  Afters ::= CHOICE { cheese IA5String,
                      dessert IA5String }
END 

उपयोगकर्ता के गाइड में टैग का कोई और उल्लेख नहीं किया गया है।

3.5 ASN.1 प्रकार

यह खंड ASN.1 प्रकारों का वर्णन करता है, जिसमें उनकी कार्यक्षमता, उद्देश्य, और मान कैसे Erlang में दिए गए हैं।

ASN.1 में आदिम और निर्मित दोनों प्रकार हैं:

ध्यान दें

प्रत्येक ASN.1 प्रकार के मूल्यों का Erlang में अपना स्वयं का प्रतिनिधित्व है, जैसा कि निम्नलिखित वर्गों में वर्णित है। उपयोगकर्ताओं को प्रतिनिधित्व के अनुसार एन्कोडिंग के लिए इन मूल्यों को प्रदान करना चाहिए, जैसा कि निम्नलिखित उदाहरण में दिखाया गया है:

Operational ::= BOOLEAN --ASN.1 definition    

Erlang कोड में यह इस प्रकार दिख सकता है:

Val = true,
{ok,Bytes} = MyModule:encode('Operational', Val),    

बूलियन

ASN.1 में बूलियन ऐसे मान व्यक्त करते हैं जो TRUE या FALSE हो सकते हैं। TRUE और FALSE को दिए गए अर्थ इस पाठ के दायरे से बाहर हैं।

ASN.1 में यह संभव है:

Operational ::= BOOLEAN

एर्लांग में Operational टाइप करने के लिए एक मान असाइन करना निम्नलिखित एर्लैंग कोड का उपयोग करके संभव है:

Myvar1 = true,

इस प्रकार, एरलांग में परमाणुओं को एक true और false में इस्तेमाल किया जाता है।

पूर्णांक

ASN.1 ही अनिश्चित काल के बड़े पूर्णांक निर्दिष्ट करता है। संस्करण 4.3 के साथ एरलैंग सिस्टम और अनिश्चित काल के बड़े पूर्णांकों के अभ्यास में उच्चतर बड़े पूर्णांक का समर्थन करता है।

सबटाइपिंग की अवधारणा पूर्णांकों और अन्य ASN.1 प्रकारों पर लागू की जा सकती है। सबटाइपिंग का विवरण यहां नहीं समझाया गया है; अधिक जानकारी के लिए, X.680 देखें। एक पूर्णांक के रूप में एक प्रकार को परिभाषित करते समय विभिन्न सिंटैक्स की अनुमति होती है:

T1 ::= INTEGER
T2 ::= INTEGER (-2..7)
T3 ::= INTEGER (0..MAX)
T4 ::= INTEGER (0<..MAX)
T5 ::= INTEGER (MIN<..-99)
T6 ::= INTEGER {red(0),blue(1),white(2)}

ASN.1 INTEGER का एरलैंग प्रतिनिधित्व एक पूर्णांक या परमाणु है यदि एक Named Number List (पिछली सूची में T6 देखें) निर्दिष्ट है।

निम्नलिखित Erlang कोड का एक उदाहरण है जो पिछली सूची के प्रकारों के लिए मान प्रदान करता है:

T1value = 0,
T2value = 6,
T6value1 = blue,
T6value2 = 0,
T6value3 = white

ये Erlang चर अब ASN.1 परिभाषित प्रकारों के वैध उदाहरणों से बंधे हैं। मूल्य की इस शैली को बाइट्स की एक श्रृंखला में रूपांतरण के लिए सीधे एनकोडर में पारित किया जा सकता है।

यदि Named Number List में मान किसी प्रतीक से मेल खाता है तो डिकोडर एक परमाणु लौटाता है।

असली

निम्न ASN.1 प्रकार का उपयोग वास्तविक संख्याओं के लिए किया जाता है:

R1 ::= REAL

इसे एरलांग में एक मूल्य इस प्रकार दिया गया है:

R1value1 = "2.14",
R1value2 = {256,10,-2},

अंतिम पंक्ति में, ध्यान दें कि टपल {256,10, -2} एक विशेष अंकन में वास्तविक संख्या 2.56 है, जो संख्या को "2.56" रूप में बताते हुए तेजी से एनकोड करता है। एरिटी थ्री टपल {Mantissa,Base,Exponent} , यानी मंटिसा * बेस ^ एक्सपोनेंट।

शून्य

प्रकार NULL उपयुक्त है जहां आपूर्ति और मूल्य की मान्यता महत्वपूर्ण है लेकिन वास्तविक मूल्य नहीं है।

Notype ::= NULL

इस प्रकार को एरलांग में इस प्रकार दिया गया है:

N1 = 'NULL',

वास्तविक मूल्य 'NULL' परमाणु 'NULL'

प्रगणित

जिस प्रकार का उपयोग किया जा सकता है उसका उपयोग तब किया जा सकता है जब आप जिस मूल्य का वर्णन करना चाहते हैं वह केवल पूर्वनिर्धारित मूल्यों के सेट में से एक ले सकता है। उदाहरण:

DaysOfTheWeek ::= ENUMERATED { 
    sunday(1),monday(2),tuesday(3),
    wednesday(4),thursday(5),friday(6),saturday(7) }

उदाहरण के लिए, एरलांग में एक सप्ताह के दिन का मान निर्दिष्ट करने के लिए, प्रकार परिभाषा के Enumerations में समान परमाणु का उपयोग करें:

Day1 = saturday,

प्रगणित प्रकार एक पूर्णांक प्रकार के समान है, जब पूर्वनिर्धारित मूल्यों के एक सेट के साथ परिभाषित किया गया है। अंतर यह है कि एक एनुमरेटेड प्रकार में केवल निर्दिष्ट मान हो सकते हैं, जबकि पूर्णांक का कोई भी मान हो सकता है।

BIT STRING

BIT STRING उपयोग उन सूचनाओं को मॉडल करने के लिए किया जा सकता है जो बिट्स की मनमानी लंबाई श्रृंखला से बनी होती हैं। इसका उपयोग झंडे के चयन के लिए किया जाना है, बाइनरी फ़ाइलों के लिए नहीं।

ASN.1 में, BIT STRING परिभाषाएँ निम्नानुसार देख सकती हैं:

Bits1 ::= BIT STRING
Bits2 ::= BIT STRING {foo(0),bar(1),gnu(2),gnome(3),punk(14)}

निम्नलिखित दो सूचनाएं BIT STRING में BIT STRING मूल्यों के प्रतिनिधित्व के लिए उपलब्ध हैं और इनकोड कार्यों के लिए इनपुट के रूप में:

  • एक बिटस्ट्रिंग। डिफ़ॉल्ट रूप से, कोई प्रतीकात्मक नाम वाला BIT STRING एक इरलैंग बिटस्ट्रिंग में डिकोड किया जाता है।
  • BIT STRING परिभाषा में NamedBitList में परमाणुओं के अनुरूप परमाणुओं की एक सूची। प्रतीकात्मक नामों के साथ BIT STRING को हमेशा निम्न उदाहरण में दिखाए गए प्रारूप में डिकोड किया जाता है:
Bits1Val1 = <<0:1,1:1,0:1,1:1,1:1>>,
Bits2Val1 = [gnu,punk],
Bits2Val2 = <<2#1110:4>>,
Bits2Val3 = [bar,gnu,gnome],

Bits2Val2 और Bits2Val3 समान मूल्य को दर्शाते हैं।

Bits2Val1 को प्रतीकात्मक मान दिया गया है। असाइनमेंट का अर्थ है कि gnu और punk यानी बिट्स 2 और 14 से संबंधित बिट्स 1 पर सेट हैं, और बाकी को 0. पर सेट किया गया है। प्रतीकात्मक मानों को मूल्यों की सूची के रूप में दिखाया गया है। यदि कोई नामित मान, जो कि परिभाषा में निर्दिष्ट नहीं है, तो दिखाया गया है, एक रनटाइम त्रुटि होती है।

BIT STRING को भी उदाहरण के लिए, एक SIZE विनिर्देशन के साथ घटाया जा सकता है:

Bits3 ::= BIT STRING (SIZE(0..31))      

इसका मतलब यह है कि 31 से थोड़ा अधिक सेट नहीं किया जा सकता है।

बीआईटी STRING के लिए पदावनत प्रतिनिधि

पहले वर्णित अभ्यावेदन के अलावा, निम्नलिखित पदावनत अभ्यावेदन उपलब्ध हैं यदि विनिर्देश को विकल्प legacy_erlang_types साथ संकलित किया गया है:

  • एए बाइनरी अंकों की एक सूची (0 या 1)। यह प्रारूप एन्कोड फ़ंक्शन के इनपुट के रूप में स्वीकार किया जाता है, और यदि विकल्प legacy_bit_string दिया जाता है, तो इस प्रारूप में BIT STRING डिकोड किया जाता है।
  • जैसा कि {Unused,Binary} जहां Unused निरूपित करता है कि शून्य में बिट्स कम से कम महत्वपूर्ण बाइट में Binary शून्य बिट बिट्स कितने अनुगामी हैं। इस प्रारूप को एन्कोड फ़ंक्शन के इनपुट के रूप में स्वीकार किया जाता है, और यदि इस स्वरूप को compact_bit_string किया गया है तो BIT STRING को इस प्रारूप में डिकोड किया गया है।
  • हेक्साडेसिमल संख्या (या पूर्णांक) के रूप में। इससे बचें क्योंकि इस प्रारूप में BIT STRING मान का गलत अर्थ निकालना आसान है।

OCTET STRING

OCTET STRING सभी ASN.1 प्रकारों में सबसे सरल है। OCTET STRING केवल दो नियमों का पालन करने वाली द्विआधारी फाइलें या अन्य असंरचित जानकारी, उदाहरण के लिए, स्थानांतरित या स्थानांतरित होती है: बाइट्स में ओकटेट्स शामिल हैं और एन्कोडिंग की आवश्यकता नहीं है।

निम्नलिखित ASN.1 प्रकार की परिभाषाएँ रखना संभव है:

O1 ::= OCTET STRING
O2 ::= OCTET STRING (SIZE(28))      

एर्लांग में निम्नलिखित उदाहरण असाइनमेंट के साथ:

O1Val = <<17,13,19,20,0,0,255,254>>,
O2Val = <<"must be exactly 28 chars....">>,

डिफ़ॉल्ट रूप से, एक OCTET STRING को हमेशा एर्लांग बाइनरी के रूप में दर्शाया जाता है। यदि विनिर्देश को legacy_erlang_types साथ संकलित किया गया है, तो एन्कोड फ़ंक्शन दोनों सूचियों और बायनेरिज़ को स्वीकार करते हैं, और डीकोड फ़ंक्शन एक सूची के लिए OCTET STRING को डिकोड करते हैं।

चरित्र के तार

ASN.1 चरित्र सेट की एक विस्तृत विविधता का समर्थन करता है। OCTET STRING और एक वर्ण स्ट्रिंग के बीच मुख्य अंतर यह है कि OCTET STRING द्वारा वितरित बाइट्स पर कोई शब्दार्थ नहीं लगाया गया है।

हालांकि, उदाहरण के लिए, उपयोग करते समय, IA5String (जो बारीकी से ASCII जैसा दिखता है), बाइट 65 (दशमलव अंकन में) का अर्थ है चरित्र 'ए'।

उदाहरण के लिए, यदि एक परिभाषित प्रकार एक वीडियोटेक्सस्ट्रिंग होना है और अहस्ताक्षरित पूर्णांक मान X साथ प्राप्त किया जाता है, तो ऑक्टेट को मानक ITU-T T.100, T.101 में निर्दिष्ट किया जाना है।

ASN.1 से Erlang संकलक प्रत्येक BER स्ट्रिंग ऑक्टेट मान की सही व्याख्या अलग-अलग वर्ण स्ट्रिंग के साथ निर्धारित नहीं करता है। आवेदन ओकटेट्स की व्याख्या के लिए जिम्मेदार है। इसलिए, बीईआर स्ट्रिंग दृष्टिकोण से, ओकटेट चरित्र के तार के समान होते हैं और उसी तरह संकलित होते हैं।

जब प्रति का उपयोग किया जाता है, तो OCTET STRING s और अन्य तारों के बीच एन्कोडिंग योजना में एक महत्वपूर्ण अंतर होता है। एक प्रकार के लिए निर्दिष्ट बाधाएं पेर के लिए विशेष रूप से महत्वपूर्ण हैं, जहां वे एन्कोडिंग को प्रभावित करते हैं।

उदाहरण:

Digs ::= NumericString (SIZE(1..3))
TextFile ::= IA5String (SIZE(0..64000))      

इसी Erlang कार्य:

DigsVal1 = "456",
DigsVal2 = "123",
TextFileVal1 = "abc...xyz...",
TextFileVal2 = [88,76,55,44,99,121 .......... a lot of characters here ....]

"BMPString" और "UniversalString" के लिए एरलंग प्रतिनिधित्व या तो ASCII मूल्यों की एक सूची या चौगुनी की सूची है। चतुष्कोणीय प्रतिनिधित्व पात्रों के यूनिकोड मानक प्रतिनिधित्व से जुड़ता है। ASCII वर्णों का प्रतिनिधित्व सभी वर्णों द्वारा किया जाता है, जो चरित्र 'ए' के ​​लिए {0,0,0,65} जैसे तीन शून्य से शुरू होता है। जब इन स्ट्रिंग्स के लिए एक मान को डीकोड करते हैं, तो परिणाम एक एसीसीआईआई वर्ण के अनुसार चौगुनी या पूर्णांक की एक सूची है।

निम्न उदाहरण दिखाता है कि यह कैसे काम करता है। मान लें कि निम्नलिखित विनिर्देश फ़ाइल में है PrimStrings.asn1 :

PrimStrings DEFINITIONS AUTOMATIC TAGS ::=
BEGIN
   BMP ::= BMPString
END    

एन्कोडिंग और कुछ स्ट्रिंग्स को डिकोड करना:

1> asn1ct:compile('PrimStrings', [ber]).
ok
2> {ok,Bytes1} = 'PrimStrings':encode('BMP', [{0,0,53,53},{0,0,45,56}]).
{ok,<<30,4,53,54,45,56>>}
3> 'PrimStrings':decode('BMP', Bytes1).
{ok,[{0,0,53,53},{0,0,45,56}]}
4> {ok,Bytes2} = 'PrimStrings':encode('BMP', [{0,0,53,53},{0,0,0,65}]).
{ok,<<30,4,53,53,0,65>>}
5> 'PrimStrings':decode('BMP', Bytes2).
{ok,[{0,0,53,53},65]}
6> {ok,Bytes3} = 'PrimStrings':encode('BMP', "BMP string").
{ok,<<30,20,0,66,0,77,0,80,0,32,0,115,0,116,0,114,0,105,0,110,0,103>>}
7> 'PrimStrings':decode('BMP', Bytes3).
{ok,"BMP string"}      

टाइप करें UTF8String को Erlang में UTF-8 एन्कोडेड बाइनरी के रूप में दर्शाया गया है। ऐसे बायनेरिज़ सीधे बाइनरी सिंटैक्स का उपयोग करके या यूनिकोड कोड बिंदुओं की सूची से फ़ंक्शन unicode:characters_to_binary/1 का उपयोग करके बनाया जा सकता है unicode:characters_to_binary/1

निम्नलिखित उदाहरण दिखाता है कि UTF-8 एन्कोडेड बायनेरिज़ कैसे बना और हेरफेर किया जा सकता है:

1> Gs = "Мой маленький Гном".
[1052,1086,1081,32,1084,1072,1083,1077,1085,1100,1082,1080,
 1081,32,1043,1085,1086,1084]
2> Gbin = unicode:characters_to_binary(Gs).
<<208,156,208,190,208,185,32,208,188,208,176,208,187,208,
  181,208,189,209,140,208,186,208,184,208,185,32,208,147,
  208,...>>
3> Gbin = <<"Мой маленький Гном"/utf8>>.
<<208,156,208,190,208,185,32,208,188,208,176,208,187,208,
  181,208,189,209,140,208,186,208,184,208,185,32,208,147,
  208,...>>
4> Gs = unicode:characters_to_list(Gbin).
[1052,1086,1081,32,1084,1072,1083,1077,1085,1100,1082,1080,
 1081,32,1043,1085,1086,1084]

विवरण के लिए, STDLIB में unicode मॉड्यूल देखें।

निम्नलिखित उदाहरण में, इस ASN.1 विनिर्देश का उपयोग किया जाता है:

UTF DEFINITIONS AUTOMATIC TAGS ::=
BEGIN
   UTF ::= UTF8String
END   

यूनिकोड वर्णों के साथ स्ट्रिंग को एन्कोडिंग और डिकोड करना:

5> asn1ct:compile('UTF', [ber]).
ok
6> {ok,Bytes1} = 'UTF':encode('UTF', <<"Гном"/utf8>>).
{ok,<<12,8,208,147,208,189,208,190,208,188>>}
7> {ok,Bin1} = 'UTF':decode('UTF', Bytes1).
{ok,<<208,147,208,189,208,190,208,188>>}
8> io:format("~ts\n", [Bin1]).
Гном
ok
9> unicode:characters_to_list(Bin1).
[1043,1085,1086,1084]   

उद्देश्य IDENTIFIER

जब भी एक विशिष्ट पहचान की आवश्यकता होती है तो OBJECT IDENTIFIER का उपयोग किया जाता है। एक ASN.1 मॉड्यूल, एक ट्रांसफ़र सिंटैक्स, और इसी तरह, OBJECT IDENTIFIER साथ पहचाना जाता है। निम्न उदाहरण मान लें:

Oid ::= OBJECT IDENTIFIER

इसलिए, निम्न उदाहरण 'ओड' प्रकार का एक वैध एर्लांग उदाहरण है:

OidVal1 = {1,2,55},

OBJECT IDENTIFIER मान केवल लगातार मूल्यों के साथ एक ट्यूपल है, जो पूर्णांक होना चाहिए।

पहला मान 0, 1, या 2 के मानों तक सीमित है। दूसरा मान 0..39 की सीमा में होना चाहिए जब पहला मान 0 या 1 होता है।

OBJECT IDENTIFIER एक महत्वपूर्ण प्रकार है और इसे विभिन्न मानकों के भीतर व्यापक रूप से विभिन्न वस्तुओं की विशिष्ट रूप से पहचान करने के लिए उपयोग किया जाता है। डबिसन: ASN.1 - विषम प्रणालियों के बीच संचार में OBJECT IDENTIFIER के उपयोग का एक आसान-से-समझने वाला विवरण शामिल है।

वस्तु विवरणक

इस प्रकार के मानों को एक साधारण स्ट्रिंग के रूप में एक मान दिया जा सकता है:

"This is the value of an Object descriptor"

समय प्रकार

ASN.1 के भीतर दो समय प्रकार परिभाषित किए गए हैं: सामान्यीकृत समय और सार्वभौमिक समय समन्वित (UTC)। दोनों को दोहरे उद्धरण चिह्नों के भीतर एक साधारण स्ट्रिंग के रूप में एक मान दिया जाता है, उदाहरण के लिए, "19820102070533.8"।

डीईआर एन्कोडिंग के लिए, कंपाइलर समय मूल्यों की वैधता की जांच नहीं करता है। उन तार पर डीईआर आवश्यकताओं को पूरा करने के लिए आवेदन के लिए एक मामले के रूप में माना जाता है।

SEQUENCE

ASN.1 के संरचित प्रकारों का निर्माण अन्य प्रकारों से किया जाता है, जो कि सी और एरे की संरचना के समान है।

ASN.1 में एक SEQUENCE C में एक संरचना और Erlang में एक रिकॉर्ड के साथ तुलनीय है। इस तरह से एक परिभाषा को परिभाषित किया जा सकता है:

Pdu ::= SEQUENCE {
   a INTEGER,
   b REAL,
   c OBJECT IDENTIFIER,
   d NULL }      

यह एक 4-घटक संरचना है जिसे Pdu कहा जाता है। डिफ़ॉल्ट रूप से, SEQUENCE में एक रिकॉर्ड द्वारा एक SEQUENCE का प्रतिनिधित्व किया जाता है। इसे एक मानचित्र के रूप में भी दर्शाया जा सकता है; Map representation for SEQUENCE and SET देखें। ASN.1 मॉड्यूल में प्रत्येक SEQUENCE और SET एक Erlang रिकॉर्ड घोषणा उत्पन्न होती है। Pdu , निम्नलिखित की तरह एक रिकॉर्ड परिभाषित किया गया है:

-record('Pdu',{a, b, c, d}).      

मॉड्यूल M लिए रिकॉर्ड घोषणाओं को एक अलग M.hrl फ़ाइल में रखा गया है।

मानों को एरलांग में निम्नानुसार सौंपा जा सकता है:

MyPdu = #'Pdu'{a=22,b=77.99,c={0,1,2,3,4},d='NULL'}.      

डिकोड फ़ंक्शन एक परिणाम के रूप में एक रिकॉर्ड लौटते हैं जब एक SEQUENCE या SET

एक SEQUENCE और SET में वास्तविक मान के बाद DEFAULT कीवर्ड के साथ एक घटक हो सकता है, जो कि डिफ़ॉल्ट मान है। DEFAULT कीवर्ड का अर्थ है कि एन्कोडिंग करने वाला एप्लिकेशन मान के एन्कोडिंग को छोड़ सकता है, जिसके परिणामस्वरूप प्राप्त एप्लिकेशन को भेजने के लिए कम बाइट्स होते हैं।

एक अनुप्रयोग परमाणु asn1_DEFAULT का उपयोग यह इंगित करने के लिए कर सकता है कि एन्कोडिंग asn1_DEFAULT में उस स्थिति के लिए छोड़ा जाना है।

एन्कोडिंग नियमों के आधार पर, एनकोडर भी दिए गए मान की तुलना डिफ़ॉल्ट मान से कर सकता है और मान समान होने पर एन्कोडिंग को स्वचालित रूप से छोड़ देता है। मानों की तुलना करने के लिए एन्कोडर कितना प्रयास करता है यह एन्कोडिंग नियमों पर निर्भर करता है। DER एन्कोडिंग नियम डिफ़ॉल्ट मान के बराबर मूल्य को एन्कोडिंग करने से मना करता है, इसलिए इसमें अन्य एन्कोडिंग नियमों के लिए एन्कोडर्स की तुलना में अधिक गहन और समय लेने वाली तुलना होती है।

निम्नलिखित उदाहरण में, इस ASN.1 विनिर्देश का उपयोग किया जाता है:

File DEFINITIONS AUTOMATIC TAGS ::=
BEGIN
Seq1 ::= SEQUENCE {
    a INTEGER DEFAULT 1,
    b Seq2 DEFAULT {aa TRUE, bb 15}
}

Seq2 ::= SEQUENCE {
    aa BOOLEAN,
    bb INTEGER
}

Seq3 ::= SEQUENCE {
    bs BIT STRING {a(0), b(1), c(2)} DEFAULT {a, c}
}
END 

उदाहरण जहां BER एनकोडर डिफ़ॉल्ट मानों की एन्कोडिंग को छोड़ने में सक्षम है:

1> asn1ct:compile('File', [ber]).
ok
2> 'File':encode('Seq1', {'Seq1',asn1_DEFAULT,asn1_DEFAULT}).
{ok,<<48,0>>}
3> 'File':encode('Seq1', {'Seq1',1,{'Seq2',true,15}}).
{ok,<<48,0>>}   

BIT STRING एनकोडर जहां बीईआर एनकोडर एन्कोडिंग से बाहर नहीं निकलता है, नाम के साथ उदाहरण:

4> 'File':encode('Seq3', {'Seq3',asn1_DEFAULT).
{ok,<<48,0>>}
5> 'File':encode('Seq3', {'Seq3',<<16#101:3>>).
{ok,<<48,4,128,2,5,160>>}     

DER एनकोडर एक ही BIT STRING लिए एन्कोडिंग को छोड़ देता है:

6> asn1ct:compile('File', [ber,der]).
ok
7> 'File':encode('Seq3', {'Seq3',asn1_DEFAULT).
{ok,<<48,0>>}
8> 'File':encode('Seq3', {'Seq3',<<16#101:3>>).
{ok,<<48,0>>}     

सेट

Erlang में, SET प्रकार का उपयोग SEQUENCE रूप में किया जाता है। ध्यान दें कि यदि BER या DER एन्कोडिंग नियमों का उपयोग किया जाता है, तो SET को डिकोड करना एक SEQUENCE डिकोड करने की तुलना में धीमा होता है क्योंकि घटकों को क्रमबद्ध किया जाना चाहिए।

SEQUENCE और SET के लिए एक्स्टेंसिबिलिटी

जब SEQUENCE या SET में निम्नलिखित के रूप में एक्सटेंशन मार्कर और एक्सटेंशन घटक होते हैं, तो टाइप ASN.1 कल्पना के नए संस्करणों में अधिक घटक प्राप्त कर सकता है:

SExt ::= SEQUENCE {
           a INTEGER,
           ...,
           b BOOLEAN }

इस मामले में इसे एक नया घटक b मिला है। इस प्रकार, आने वाले संदेश जो डिकोड किए जाते हैं उनमें इस एक से अधिक या बुखार घटक हो सकते हैं।

संदेश को एन्कोडिंग करते समय घटक b को मूल घटक के रूप में माना जाता है। इस मामले में, चूंकि यह एक वैकल्पिक तत्व नहीं है, इसलिए इसे एन्कोड किया जाना चाहिए।

डिकोडिंग के दौरान, रिकॉर्ड के b क्षेत्र को b घटक का डिकोड किया गया मान मिलता है, यदि मौजूद है, अन्यथा मान asn1_NOVALUE

SEQUENCE और SET के लिए मानचित्र प्रतिनिधित्व

यदि ASN.1 मॉड्यूल को विकल्प maps साथ संकलित किया गया है, तो SEQUENCE और SET प्रकार को मानचित्र के रूप में दर्शाया गया है।

निम्नलिखित उदाहरण में, इस ASN.1 विनिर्देश का उपयोग किया जाता है:

File DEFINITIONS AUTOMATIC TAGS ::=
BEGIN
Seq1 ::= SEQUENCE {
    a INTEGER DEFAULT 42,
    b BOOLEAN OPTIONAL,
    c IA5String
}
END   

यदि उनके पास कोई मूल्य नहीं है, तो वैकल्पिक फ़ील्ड को नक्शे से छोड़ा जाना चाहिए:

1> asn1ct:compile('File', [per,maps]).
ok
2> {ok,E} = 'File':encode('Seq1', #{a=>0,c=>"string"}).
{ok,<<128,1,0,6,115,116,114,105,110,103>>} 

डिकोडिंग करते समय, वैकल्पिक फ़ील्ड को नक्शे से हटा दिया जाएगा:

3> 'File':decode('Seq1', E).
{ok,#{a => 0,c => "string"}}   

डिफ़ॉल्ट मान मानचित्र से छोड़ा जा सकता है:

4> {ok,E2} = 'File':encode('Seq1', #{c=>"string"}).
{ok,<<0,6,115,116,114,105,110,103>>}
5> 'File':decode('Seq1', E2).
{ok,#{a => 42,c => "string"}}   
ध्यान दें

यह नक्शे के साथ परमाणुओं asn1_VALUE और asn1_DEFAULT का उपयोग करने की अनुमति नहीं है।

पसंद

प्रकार CHOICE एक अंतरिक्ष सेवर है और C में एक 'संघ' की अवधारणा के समान है।

निम्नलिखित मान लें:

SomeModuleName DEFINITIONS AUTOMATIC TAGS ::=
BEGIN
T ::= CHOICE {
        x REAL,
        y INTEGER,
        z OBJECT IDENTIFIER }
END 

इसके बाद मूल्यों को असाइन करना संभव है:

TVal1 = {y,17},
TVal2 = {z,{0,1,2}},

एक CHOICE मान को हमेशा tuple {ChoiceAlternative, Val} रूप में दर्शाया जाता है {ChoiceAlternative, Val} जहां ChoiceAlternative एक परमाणु है जो चयनित विकल्प विकल्प को दर्शाता है।

एक्स्टेंसिबल चॉइस

जब एक CHOICE में एक एक्सटेंशन मार्कर होता है और डिकोडर CHOICE किसी अज्ञात विकल्प का पता लगाता है, तो मूल्य इस प्रकार दर्शाया जाता है:

{asn1_ExtAlt, BytesForOpenType}

यहाँ BytesForOpenType एक बाइट्स की सूची है, जिसमें "अज्ञात" CHOICE का एन्कोडिंग है।

सेट और विजय की

कई प्रोग्रामिंग भाषाओं में एक सरणी की अवधारणा के अनुरूप SET OF और SEQUENCE OF प्रकार। उदाहरण के लिए, दोनों प्रकारों के लिए एरलंग सिंटैक्स सीधा है:

Arr1 ::= SET SIZE (5) OF INTEGER (4..9) 
Arr2 ::= SEQUENCE OF OCTET STRING      

Erlang में निम्नलिखित आवेदन कर सकते हैं:

Arr1Val = [4,5,6,7,8],
Arr2Val = ["abc",[14,34,54],"Octets"],      

ध्यान दें कि SET OF प्रकार की परिभाषा का अर्थ है कि घटकों का क्रम अपरिभाषित है, लेकिन व्यवहार में SET OF और SEQUENCE OF बीच कोई अंतर नहीं है। Erlang के लिए ASN.1 संकलक एन्कोडिंग से पहले घटकों के SET OF क्रम को यादृच्छिक नहीं करता है।

हालांकि, SET OF प्रकार के मूल्य के लिए, DER एन्कोडिंग प्रारूप में तत्वों को उनके एन्कोडिंग के आरोही क्रम में भेजने की आवश्यकता होती है, जो रनटाइम में एक महंगी छँटाई प्रक्रिया का अर्थ है। इसलिए यदि संभव हो तो SET OF SEQUENCE OF बजाय SEQUENCE OF का उपयोग करने की अनुशंसा की जाती है।

किसी भी और किसी भी तरह से

ANY और ANY DEFINED BY ANY प्रकार से ANY DEFINED BY 1994 से मानक से हटा दिया गया है। यह सिफारिश की जाती है कि इन प्रकारों का किसी भी अधिक उपयोग न करें। हालाँकि, वे कुछ पुराने ASN.1 मॉड्यूल में मौजूद हो सकते हैं। इस प्रकार का विचार एक परिभाषा में "छेद" छोड़ने के लिए था, जहां किसी भी प्रकार का अनिर्दिष्ट डेटा, यहां तक ​​कि गैर- ASN.1 डेटा को रखना संभव था।

इस प्रकार का मान एक open type रूप में एन्कोड किया गया है।

इसके बजाय ANY और ANY DEFINED BY , यह information object class , table constraints और parameterization उपयोग की सिफारिश की जाती है। विशेष रूप से [email protected] का निर्माण करें [email protected] ANY हटाए गए के रूप में ही पूरा होता है।

Information object भी देखें।

बाहरी, उन्नत पीडीवी, और चार्ज STRING

प्रस्तुति स्तर बातचीत में EXTERNAL , EMBEDDED PDV और CHARACTER STRING प्रकार का उपयोग किया जाता है। वे अपने संबंधित प्रकार के अनुसार एन्कोडेड हैं, X.680 देखें।

EXTERNAL का प्रकार 1994 से पहले थोड़ा अलग प्रकार से जुड़ा था। X.691 कहता है कि एन्कोडिंग को पुराने से जुड़े प्रकार का पालन करना चाहिए। इसलिए, एन्कोडेड / डीकोड फ़ंक्शन एन्कोडिंग से पहले नए प्रारूप के मूल्यों को पुराने प्रारूप में परिवर्तित करते हैं। इसका मतलब है कि एन्कोडिंग के लिए किसी भी प्रारूप के EXTERNAL प्रकार के मूल्यों का उपयोग करने की अनुमति है। डीकोड किए गए मान हमेशा नए प्रारूप में लौटाए जाते हैं।

एंबेडेड नाम प्रकार

पहले वर्णित संरचित प्रकार उनके घटकों के रूप में अन्य नामित प्रकार हो सकते हैं। Erlang में ASN.1 टाइप T कंपोनेंट C के मान को असाइन करने का सामान्य सिंटैक्स रिकॉर्ड सिंटैक्स #'T'{'C'=Value} । यहाँ Value एक और प्रकार T2 उदाहरण हो सकता है, उदाहरण के लिए:

EmbeddedExample DEFINITIONS AUTOMATIC TAGS ::=
BEGIN
B ::= SEQUENCE {
        a Arr1,
        b T }

Arr1 ::= SET SIZE (5) OF INTEGER (4..9) 

T ::= CHOICE {
        x REAL,
        y INTEGER,
        z OBJECT IDENTIFIER }
        END      

SEQUENCE में निम्नानुसार b को एन्कोड किया जा सकता है:

1> 'EmbeddedExample':encode('B', {'B',[4,5,6,7,8],{x,"7.77"}}).
{ok,<<5,56,0,8,3,55,55,55,46,69,45,50>>} 

3.6 .hrl फाइलों में रिकॉर्ड्स का नामकरण

जब विकल्प maps दिए जाते हैं, तो कोई .hrl फाइलें उत्पन्न नहीं .hrl । इस खंड के बाकी संकलक के व्यवहार का वर्णन करते हैं जब maps का उपयोग नहीं किया जाता है।

जब ASN.1 विनिर्देश संकलित किया जाता है, तो SET या SEQUENCE प्रकार के सभी परिभाषित प्रकार उत्पन्न .hrl फ़ाइल में संबंधित रिकॉर्ड में .hrl हैं। ऐसा इसलिए है क्योंकि SET और SEQUENCE के मूल्यों को डिफ़ॉल्ट रूप से रिकॉर्ड के रूप में दर्शाया जाता है।

इस कार्यक्षमता के कुछ विशेष मामलों को अगले भाग में प्रस्तुत किया गया है।

एंबेडेड स्ट्रक्चर्ड टाइप

ASN.1 में उन घटकों का भी होना संभव है जो स्वयं संरचित प्रकार हैं। उदाहरण के लिए, निम्नलिखित होना संभव है:

Emb ::= SEQUENCE {
    a SEQUENCE OF OCTET STRING,
    b SET {
       a INTEGER,
       b INTEGER DEFAULT 66},
    c CHOICE {
       a INTEGER,
       b FooType } }

FooType ::= [3] VisibleString      

निम्न अभिलेख प्रकार Emb कारण उत्पन्न होते हैं:

-record('Emb,{a, b, c}).
-record('Emb_b',{a, b = asn1_DEFAULT}). % the embedded SET type 

प्रकार के मानों को निम्न प्रकार से सौंपा जा सकता है:

V = #'Emb'{a=["qqqq",[1,2,255]], 
           b = #'Emb_b'{a=99}, 
           c ={b,"Can you see this"}}.

एक SEQUENCE / SET में SEQUENCE / SET प्रकार के एम्बेडेड प्रकार के लिए, रिकॉर्ड नाम एक अंडरस्कोर और घटक नाम के साथ बढ़ाया जाता है। यदि एम्बेडेड संरचना SEQUENCE , SET , या CHOICE प्रकारों के साथ पंक्ति में गहरी है, तो प्रत्येक घटक का नाम / वैकल्पिक नाम रिकॉर्ड नाम में जोड़ा जाता है।

उदाहरण:

Seq ::= SEQUENCE{
    a CHOICE{
        b SEQUENCE {
           c  INTEGER
        }
    }
}      

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

-record('Seq_a_b',{c}).      

यदि संरचित प्रकार में एक घटक होता है जिसमें एम्बेडेड SEQUENCE OF / SET OF जिसके बदले एम्बेडेड प्रकार एक SEQUENCE / SET , तो यह निम्न उदाहरण SET OF अलावा SEQUENCE OF / SET OF साथ एक रिकॉर्ड देता है:

Seq ::= SEQUENCE {
    a SEQUENCE OF SEQUENCE {
           b
               }
    c SET OF SEQUENCE {
           d
               }
}      

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

-record('Seq_a_SEQOF'{b}).
-record('Seq_c_SETOF'{d}).      

एक पैरामीटर प्रकार को एक एम्बेडेड प्रकार माना जाता है। हर बार जब इस प्रकार का संदर्भ दिया जाता है, तो इसका एक उदाहरण परिभाषित किया जाता है। इस प्रकार, निम्न उदाहरण में 'Seq_b' नाम का एक रिकॉर्ड .hrl फ़ाइल में उत्पन्न होता है और इसका उपयोग मान रखने के लिए किया जाता है:

Seq ::= SEQUENCE {
    b PType{INTEGER}
}

PType{T} ::= SEQUENCE{
    id T
}      

पुनरावर्ती प्रकार

प्रकार जो स्वयं को संदर्भित करते हैं उन्हें पुनरावर्ती प्रकार कहा जाता है। उदाहरण:

Rec ::= CHOICE {
     nothing NULL,
     something SEQUENCE {
          a INTEGER,
          b OCTET STRING,
          c Rec }}      

इसे ASN.1 में अनुमति दी गई है और ASN.1-to-Erlang कंपाइलर इस पुनरावर्ती प्रकार का समर्थन करता है। इस प्रकार के लिए एक मान Erlang में दिया गया है:

V = {something,#'Rec_something'{a = 77, 
                                b = "some octets here", 
                                c = {nothing,'NULL'}}}.      

3.7 ASN.1 मान

मान ASN.1 कोड के भीतर ही ASN.1 प्रकार को सौंपा जा सकता है, क्योंकि पिछले खंड में उन क्रियाओं के विपरीत है जहां एक मान को Erlang में ASN.1 प्रकार को सौंपा गया था। ASN.1 का पूर्ण मूल्य सिंटैक्स समर्थित है और X.680 विस्तार से वर्णन करता है कि ASN.1 में मूल्यों को कैसे असाइन किया जाए। एक छोटा उदाहरण:

TT ::= SEQUENCE {
   a INTEGER,
   b SET OF OCTET STRING }

tt TT ::= {a 77,b {"kalle","kula"}}    

यहाँ परिभाषित मूल्य का उपयोग कई तरीकों से किया जा सकता है। उदाहरण के लिए, इसका उपयोग कुछ DEFAULT घटक में मूल्य के रूप में किया जा सकता है:

SS ::= SET {
    s OBJECT IDENTIFIER,
    val TT DEFAULT tt }    

इसका उपयोग एक एरलंग कार्यक्रम के अंदर से भी किया जा सकता है। यदि यह ASN.1 कोड ASN.1 मॉड्यूल में परिभाषित किया गया है Values , तो ASN.1 मान एर्लांग tt से एक फ़ंक्शन कॉल के 'Values':tt() रूप में निम्न उदाहरण में पहुंच सकता है :

1> Val = 'Values':tt().
{'TT',77,["kalle","kula"]}
2> {ok,Bytes} = 'Values':encode('TT',Val).
{ok,<<48,18,128,1,77,161,13,4,5,107,97,108,108,101,4,4,
      107,117,108,97>>}
4> 'Values':decode('TT',Bytes).
{ok,{'TT',77,["kalle","kula"]}}
5>  

यह उदाहरण दिखाता है कि एक फ़ंक्शन कंपाइलर द्वारा उत्पन्न होता है जो मान का एक वैध एर्लैंग प्रतिनिधित्व लौटाता है, हालांकि मान एक जटिल प्रकार का होता है।

इसके अलावा, यदि विकल्प maps का उपयोग नहीं किया जाता है, तो .hrl फ़ाइल में प्रत्येक मान के लिए एक मैक्रो उत्पन्न होता है । तो, निर्धारित मूल्य tt को ?tt एप्लीकेशन कोड में भी निकाला जा सकता है ।

3.8 मैक्रोज़

प्रकार MACRO समर्थित नहीं है। यह अब ASN.1 मानक का हिस्सा नहीं है।

3.9 ASN.1 सूचना वस्तुएँ (X.681)

सूचना ऑब्जेक्ट क्लासेस, सूचना ऑब्जेक्ट्स और सूचना ऑब्जेक्ट सेट (क्रमशः, निम्न वर्ग, ऑब्जेक्ट और ऑब्जेक्ट सेट में) को मानक परिभाषा X.681 में परिभाषित किया गया है। केवल एक संक्षिप्त विवरण यहाँ दिया गया है।

ये निर्माण खुले प्रकारों को परिभाषित करना संभव बनाता है, अर्थात उस प्रकार के मान किसी भी ASN.1 प्रकार के हो सकते हैं। साथ ही, रिश्तों को विभिन्न प्रकारों और मूल्यों के बीच परिभाषित किया जा सकता है, क्योंकि वर्ग अपने क्षेत्रों में प्रकार, मूल्य, ऑब्जेक्ट, ऑब्जेक्ट सेट और अन्य कक्षाएं रख सकते हैं। एक वर्ग को ASN.1 में इस प्रकार परिभाषित किया जा सकता है:

GENERAL-PROCEDURE ::= CLASS {
      &Message,
      &Reply               OPTIONAL,
      &Error               OPTIONAL,
      &id          PrintableString UNIQUE
}
WITH SYNTAX {
      NEW MESSAGE     &Message
      [REPLY           &Reply]
      [ERROR           &Error]
      ADDRESS          &id
}    

एक वस्तु एक वर्ग का एक उदाहरण है। ऑब्जेक्ट सेट एक सेट है जिसमें एक निर्दिष्ट वर्ग की वस्तुएं होती हैं। एक परिभाषा इस प्रकार दिख सकती है:

object1 GENERAL-PROCEDURE ::= {
    NEW MESSAGE      PrintableString
    ADDRESS          "home"
}

object2 GENERAL-PROCEDURE ::= {
    NEW MESSAGE INTEGER
    ERROR INTEGER
    ADDRESS "remote"
}

ऑब्जेक्ट object1 वर्ग का एक उदाहरण है GENERAL-PROCEDURE और इसमें एक प्रकार का फ़ील्ड और एक निश्चित प्रकार का मूल्य फ़ील्ड है। ऑब्जेक्ट object2 में एक वैकल्पिक फ़ील्ड भी है ERROR , जो एक प्रकार का फ़ील्ड है। मैदान ADDRESS एक UNIQUE मैदान है। ऑब्जेक्ट सेट में वस्तुओं का अपने UNIQUE क्षेत्र में अद्वितीय मान होना चाहिए , जैसे GENERAL-PROCEDURES :

GENERAL-PROCEDURES GENERAL-PROCEDURE ::= {
    object1 | object2}    

आप किसी वर्ग, ऑब्जेक्ट या ऑब्जेक्ट सेट को एनकोड नहीं कर सकते, केवल अन्य ASN.1 संस्थाओं को परिभाषित करते समय इसका संदर्भ लें। आमतौर पर आप ASN.1 प्रकारों में तालिका बाधाओं और घटक संबंध बाधाओं (X.682) द्वारा सेट के साथ-साथ एक वर्ग का उल्लेख करते हैं, निम्नलिखित में:

StartMessage  ::= SEQUENCE {
    msgId  GENERAL-PROCEDURE.&id  ({GENERAL-PROCEDURES}),
    content GENERAL-PROCEDURE.&Message ({GENERAL-PROCEDURES}{@msgId}),
    }    

प्रकार में StartMessage , निम्नलिखित फ़ील्ड का अवरोध content बताता है कि फ़ील्ड में जिस प्रकार StartMessage का मान फ़ील्ड content द्वारा चुना गया है उसी प्रकार के मान से आना चाहिए msgId

तो, मान #'StartMessage'{msgId="home",content="Any Printable String"} को मान के रूप में सांकेतिक करना कानूनी है StartMessage । हालाँकि, मान #'StartMessage'{msgId="remote", content="Some String"} अवैध है क्योंकि यह StartMessage बताता है कि जब आपने GENERAL-PROCEDURES फ़ील्ड में निर्धारित ऑब्जेक्ट में किसी विशिष्ट ऑब्जेक्ट से मूल्य चुना है msgId , तो आपको सामग्री फ़ील्ड में भी उसी ऑब्जेक्ट से एक मान चुनना होगा। इस दूसरे मामले में, इसका कोई INTEGER मूल्य होना है ।

StartMessage फ़ील्ड content में किसी भी प्रकार के मूल्य के साथ एन्कोड किया जा सकता है जो ऑब्जेक्ट सेट GENERAL-PROCEDURES की गई वस्तु अपने NEW MESSAGE क्षेत्र में है। यह फ़ील्ड &Message क्लास में एक प्रकार के फ़ील्ड को संदर्भित करता है । फ़ील्ड msgId को हमेशा ए के रूप में एन्कोड किया जाता है PrintableString , क्योंकि फ़ील्ड क्लास में एक निश्चित प्रकार को संदर्भित करता है।

व्यवहार में, ऑब्जेक्ट सेट को आमतौर पर एक्स्टेंसिबल घोषित किया जाता है ताकि बाद में सेट में अधिक ऑब्जेक्ट जोड़े जा सकें। विस्तार का संकेत निम्नानुसार है:

GENERAL-PROCEDURES GENERAL-PROCEDURE ::= {
    object1 | object2, ...}    

जब एक प्रकार को डिकोड करने के लिए जो एक एक्स्टेंसिबल सेट बाधा का उपयोग करता है, तो यह हमेशा संभव है कि फ़ील्ड में मान UNIQUE अज्ञात है (अर्थात, प्रकार ASN.1 विनिर्देश के बाद के संस्करण के साथ एन्कोड किया गया है)। अनएन्कोड किए गए डेटा को तब एक टपल में लपेटकर लौटा दिया जाता है:

{asn1_OPENTYPE,Binary}

यहां Binary एक एर्लांग बाइनरी है जिसमें एन्कोडेड डेटा है। (यदि विकल्प legacy_erlang_types दिया गया है, तो केवल बाइनरी लौटा दी गई है।)

3.10 पैरामीटर (X.683)

पैरामीटर, जिसे X.683 में परिभाषित किया गया है, का उपयोग प्रकार, मान, मूल्य सेट, कक्षाएं, ऑब्जेक्ट या ऑब्जेक्ट सेट को परिभाषित करते समय किया जा सकता है। एक परिभाषा के एक हिस्से को एक पैरामीटर के रूप में आपूर्ति की जा सकती है। उदाहरण के लिए, यदि किसी Type निश्चित उद्देश्य के साथ परिभाषा में इसका उपयोग किया जाता है, तो आप इरादा व्यक्त करने के लिए टाइप नाम चाहते हैं। यह पैरामीटराइजेशन के साथ किया जा सकता है।

जब कई प्रकार (या अन्य ASN.1 निकाय) केवल कुछ मामूली मामलों में भिन्न होते हैं, लेकिन प्रकारों की संरचना समान होती है, केवल एक सामान्य प्रकार को परिभाषित किया जा सकता है और अंतर को मापदंडों के माध्यम से आपूर्ति की जा सकती है।

पैरामीटराइजेशन के उपयोग का उदाहरण:

General{Type} ::= SEQUENCE
{
     number     INTEGER,
     string     Type
}
      
T1 ::= General{PrintableString}

T2 ::= General{BIT STRING}

एक मान का एक उदाहरण जो टाइप किया जा सकता T1 है {12,"hello"}

ध्यान दें कि कंपाइलर केवल पैरामीटर किए गए प्रकारों के उदाहरणों के लिए, मानकीकृत प्रकारों के लिए एन्कोड / डीकोड फ़ंक्शन उत्पन्न नहीं करता है। इसलिए, यदि किसी फ़ाइल में प्रकार होते हैं General{} , T1 और T2 पिछले उदाहरण में, एन्कोड / डीकोड फ़ंक्शन केवल T1 और के लिए उत्पन्न होते हैं T2

Original text