2010-07-21 13 views
5

मैं निम्नलिखित ट्यूटोरियल के माध्यम से जाने की है में निहित टैगिंग को समझने के लिएमैं एक उदाहरण की जरूरत ASN.1

http://www.obj-sys.com/asn1tutorial/node12.html

तुम मुझे एक उदाहरण के साथ अंतर्निहित टैगिंग को समझने में मदद कर सकते हैं?

उत्तर

2

मुझे this thread पर्याप्त स्पष्ट होने के लिए लगता है, इसमें भी छोटे (छोटे) उदाहरण भी कठिन हैं, वे उस पर काफी 'चरम' उदाहरण हैं। IMPLICIT टैग का उपयोग करके एक और 'यथार्थवादी' उदाहरण this page में पाए जा सकते हैं।

+1

मेरे लिए शुरुआती उदाहरण पर्याप्त नहीं हैं –

+0

मैं उदाहरणों में खो गया हूं – achabahe

23

एएसएन .1 टैगिंग में, वास्तव में, दो उद्देश्यों की सेवा करता है: टाइपिंग और नामकरण। टाइपिंग का अर्थ है कि यह एक एन-डिकोडर बताता है कि किस तरह का डेटा प्रकार है (क्या यह एक स्ट्रिंग, एक पूर्णांक, एक बुलियन, एक सेट इत्यादि है), नामकरण का अर्थ है कि यदि एक ही प्रकार के कई फ़ील्ड हैं और कुछ (या उनमें से सभी) वैकल्पिक हैं, यह एन-डिकोडर को बताता है कि किस क्षेत्र के लिए मूल्य है।

आप ASN.1 की तुलना करने के लिए, मान लें कि, JSON, और आप निम्नलिखित JSON डेटा को देखो:

"Image": { 
    "Width": 800, 
    "Height": 600, 
    "Title": "View from 15th Floor" 
} 

आपको लगता है कि JSON में हर क्षेत्र हमेशा स्पष्ट रूप से ("छवि" नाम दिया गया है पर ध्यान देंगे , "चौड़ाई", "ऊंचाई", "शीर्षक") और या तो स्पष्ट रूप से या स्पष्ट रूप से टाइप किया गया है ("शीर्षक" एक स्ट्रिंग है, क्योंकि इसका मान उद्धरण से घिरा हुआ है, "चौड़ाई" एक पूर्णांक है, क्योंकि इसमें कोई उद्धरण नहीं है, केवल अंक हैं , यह "शून्य", "सत्य" या "झूठा" नहीं है, और इसकी कोई दशमलव अवधि नहीं है)।

ASN.1 में डेटा के इस टुकड़े होगा:

Image ::= SEQUENCE { 
    Width INTEGER, 
    Height INTEGER, 
    Title UTF8String 
} 

यह, किसी भी विशेष टैगिंग के बिना काम करेंगे यहाँ केवल सार्वभौमिक टैग की आवश्यकता है। Universal tags डेटा का नाम न दें, वे केवल डेटा टाइप करते हैं, इसलिए एन-डिकोडर जानते हैं कि पहले दो मान पूर्णांक हैं और अंतिम एक स्ट्रिंग है। पहला पूर्णांक चौड़ाई है और दूसरा एक ऊँचाई को बाइट स्ट्रीम में एन्कोड करने की आवश्यकता नहीं है, इसे उनके आदेश द्वारा परिभाषित किया जाता है (अनुक्रमों का एक निश्चित क्रम होता है, सेट नहीं होते हैं। जिस पृष्ठ पर आप सेट को संदर्भित करते हैं उपयोग किया जा रहा है)। इस प्रकार

अब स्कीमा बदलने के लिए:

Image ::= SEQUENCE { 
    Width INTEGER OPTIONAL, 
    Height INTEGER OPTIONAL, 
    Title UTF8String 
} 

ठीक है, अब हम एक समस्या है। मान लें कि निम्न डेटा प्राप्त हुआ है:

INTEGER(750), UTF8String("A funny kitten") 

750 क्या है? चौड़ाई या ऊंचाई? चौड़ाई (और ऊँचाई गुम हो सकती है) हो सकती है या ऊंचाई हो सकती है (और चौड़ाई गुम होती है), दोनों बाइनरी स्ट्रीम के समान दिखेंगे। जेएसओएन में यह स्पष्ट होगा क्योंकि डेटा के प्रत्येक टुकड़े का नाम एएसएन 1 में नहीं है। अब अकेले एक प्रकार पर्याप्त नहीं है, अब हमें एक नाम की भी आवश्यकता है। यही वह जगह है जहां गैर सार्वभौमिक टैग खेल में प्रवेश करते हैं। करने के लिए इसे बदलें:

Image ::= SEQUENCE { 
    Width [0] INTEGER OPTIONAL, 
    Height [1] INTEGER OPTIONAL, 
    Title UTF8String 
} 

और आप निम्न डेटा प्राप्त करते हैं:

[1]INTEGER(750), UTF8String("A funny kitten") 

तुम्हें पता है कि 750 ऊंचाई और चौड़ाई नहीं है (वहाँ बस कोई चौड़ाई है)। यहां आप एक नया टैग घोषित करते हैं (उस मामले में एक संदर्भ विशिष्ट एक) जो दो उद्देश्यों को पूरा करता है: यह एन-डीकोडर को बताता है कि यह एक पूर्णांक मान (टाइपिंग) है और यह बताता है कि कौन सा पूर्णांक मान (नामकरण) है।

लेकिन निहित और स्पष्ट टैगिंग के बीच क्या अंतर है? अंतर यह है कि निहित टैगिंग केवल डेटा को नाम देती है, एन-डिकोडर को उस नाम के लिए तत्काल प्रकार के बारे में पता है, जबकि स्पष्ट टैगिंग नाम और स्पष्ट रूप से डेटा टाइप करता है।

यदि टैगिंग स्पष्ट है, डेटा के रूप में भेजा जाएगा:

[1]INTEGER(xxx), UTF8String(yyy) 

तो एक विकोडक पता नहीं कि [1] का मतलब ऊंचाई है, भले ही यह जानता है कि बाइट्स "XXX" पार्स किया जा सकता कर रहे हैं/एक पूर्णांक मान के रूप में व्याख्या की। स्पष्ट टैगिंग का एक अन्य महत्वपूर्ण लाभ यह है कि टैग को बदलने के बिना भविष्य में प्रकार बदला जा सकता है। जैसे

Length ::= [0] INTEGER 

Length ::= [0] CHOICE { 
    integer INTEGER, 
    real REAL 
} 

टैग करने के लिए बदला जा सकता है [0] अभी भी लंबाई का मतलब है, लेकिन अब लंबाई या तो एक पूर्णांक या चल बिन्दु मान हो सकता है। चूंकि प्रकार स्पष्ट रूप से एन्कोड किया गया है, इसलिए डिकोडर्स हमेशा यह मानेंगे कि मूल्य को सही ढंग से कैसे डीकोड किया जाए और यह परिवर्तन इस प्रकार आगे और पिछड़ा संगत है (कम से कम डीकोडर स्तर पर, आवेदन स्तर पर पिछड़ा संगत नहीं है)।

यदि टैगिंग निहित है, डेटा के रूप में भेजा जाएगा:

[1](xxx), UTF8String(yyy) 

एक विकोडक पता है कि यह नहीं है कि क्या [1] है, जिसमें "xxx" के प्रकार पता नहीं होगा और इस तरह पार्स नहीं कर सकता/उस डेटा को सही ढंग से समझें। JSON के विपरीत, ASN.1 में मान केवल बाइट हैं। तो "xxx" एक, दो, तीन या शायद चार बाइट हो सकता है और उन बाइट्स को डीकोड करने के तरीके को उनके डेटा प्रकार पर निर्भर करता है, जो डेटा स्ट्रीम में ही प्रदान नहीं किया जाता है। इसके अलावा [1] के प्रकार को बदलने से मौजूदा डिकोडर्स को निश्चित रूप से तोड़ दिया जाएगा।

ठीक है, लेकिन कोई भी निहित टैगिंग का उपयोग क्यों करेगा? स्पष्ट टैगिंग का हमेशा उपयोग करना बेहतर नहीं है? स्पष्ट टैगिंग के साथ, डेटा को डेटा स्ट्रीम में भी एन्कोड किया जाना चाहिए और इसके लिए प्रति टैग दो अतिरिक्त बाइट्स की आवश्यकता होगी। डेटा ट्रांसमिशन के लिए कई हज़ार (शायद यहां तक ​​कि लाखों) टैग और जहां शायद हर एक बाइट मायने रखता है (बहुत धीमी कनेक्शन, छोटे पैकेट, उच्च पैकेट नुकसान, बहुत कमजोर प्रसंस्करण डिवाइस) और जहां दोनों पक्ष सभी कस्टम टैग जानते हैं, बैंडविड्थ बर्बाद क्यों , अनावश्यक प्रकार की जानकारी एन्कोडिंग, ट्रांसमिट और डिकोडिंग के लिए स्मृति, भंडारण और/या प्रसंस्करण समय?

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

+0

संदर्भ: https://osqa-ask.wireshark.org/questions/8277/difference-between-implicit-and-explicit -tags-asn1। यहां, ए) ए :: = INTEGER मूल्य 5 के साथ हेक्स 02 01 05, बी) बी :: = [2] मूल्य 5 के साथ लागू इंटेग्रर हेक्स 82 01 05 और सी) सी :: = [2 के रूप में एन्कोड किया गया है ] मूल्य 5 के साथ एक्सप्लोरिट इंटेगर हेक्स ए 2 03 02 01 05 के रूप में एन्कोड किया गया है। क्या कोई भी केस बी और केस सी की व्याख्या कर सकता है! – AVA

+0

@AVA यदि आपके कोई प्रश्न हैं, तो आप एक प्रश्न क्यों नहीं पूछते? आप अपना प्रश्न टिप्पणी में क्यों डालते हैं? तो सवाल पूछने के बारे में सब कुछ है, इसलिए इसके लिए जाओ और एक प्रश्न पूछें। – Mecki

संबंधित मुद्दे