आप कम बाइट्स में ASCII तार कैसे संपीड़ित करते हैं?


12

मैं एक अद्वितीय प्रोटोकॉल के साथ एक एम्बेडेड डिवाइस के साथ काम कर रहा हूं जो अन्य डिवाइसों को संदेश भेजता है और मैं एक एप्लिकेशन बना रहा हूं जो भेजे गए पैकेटों को पार्स करता है। प्रत्येक पैकेट 8 बाइट करता है। प्रोटोकॉल को पहले बाइट हेडर और शेष 7 बाइट्स डेटा के रूप में परिभाषित किया गया है।

वे एक विशेष आईडी स्ट्रिंग को पास करने की कोशिश कर रहे हैं, लेकिन आईडी स्ट्रिंग 8 वर्ण लंबा (ASCII) है, इसलिए यह 7 बाइट्स में फिट नहीं होगा।

मेरे सहकर्मी ने मुझे जो बताया वह यह है कि वे मूल स्ट्रिंग के 8 एससीआई बाइट्स को पूर्णांक (दशमलव) में बदलने जा रहे हैं और मुझे इसके 4 बाइट भेज रहे हैं। उन्होंने मुझे बताया कि मुझे 4 बाइट्स से मूल स्ट्रिंग प्राप्त करने में सक्षम होना चाहिए। मुझे इस समय अपने सिर को लपेटने में मुश्किल हो रही है।

तो अगर आपके पास "IO123456" जैसा कोई आईडी स्ट्रिंग है, तो वह है 0x49 0x4f 0x31 0x32 0x33 0x34 0x35 0x36 ASCII में .. आप पृथ्वी पर कैसे कर सकते हैं कि इसे 4 बाइट्स में पूर्णांक में बदल दें और मैं इसे मूल स्ट्रिंग प्राप्त कर सकता हूं। ? क्या मुझे कुछ याद आ रहा है या मेरे सहकर्मी गलत हैं? मैं समझता हूं कि यह वास्तव में एक विचित्र प्रश्न है लेकिन यह मेरे लिए कोई मायने नहीं रखता है।


1
प्रत्येक ASCII वर्ण केवल 7 बिट्स लेता है, इसलिए 8 ASCII वर्णों के साथ एक स्ट्रिंग वास्तव में 8 * 7 बिट्स - 7 बाइट्स में संग्रहीत की जा सकती है।
लुइसुबल

जवाबों:


17

क्या आईडी हमेशा फॉर्म में है: IO123456? आपके सहकर्मी का क्या मतलब हो सकता है कि वह केवल संख्यात्मक भाग भेजता है, जो "आईओ" भाग को छोड़ते हुए 4 बाइट्स में आसानी से फिट बैठता है।


1
यही था वह। पहले दो बाइट्स हमेशा अक्षरों में होते हैं और बाकी संख्या में होते हैं, इसलिए यह 4 बाइट्स में आसानी से फिट हो सकता है जैसा आपने कहा था। हालाँकि मुझे नहीं पता कि 4 बाइट्स की मनमानी संख्या कहाँ से आई, क्योंकि हेक्स में 999999 F423F है, इसलिए यह 3 बाइट्स है ..
l46kok

5
@ l46kok: 3-बाइट (24-बिट) पूर्णांक बहुत दुर्लभ हैं, इसलिए उनके लिए 32-बिट (4-बाइट) पूर्णांक के रूप में भेजना संभव है। मुझे पूरी तरह से आश्चर्य नहीं होगा यदि आप इसे एम्बेडेड डिवाइस के मूल प्रतिनिधित्व (बाइट ऑर्डर) में प्राप्त करते हैं।
बार्ट वैन इनगेन शानौ

16

यदि पहले दो अक्षर स्थिर नहीं हैं (लेकिन हमेशा अक्षर हैं) और शेष छह अक्षर हमेशा संख्याएँ हैं, तो "IO123456" जैसे स्ट्रिंग को बाइट -कोडेड दशमलव (BCD) प्रारूप में संख्याओं को परिवर्तित करके 5 बाइट्स में पैक किया जा सकता है :

IO123456 -> 0x49 0x4f 0x31 0x32 0x33 0x34 0x35 0x36
             |    |      \   /     \   /     \   /
            0x49 0x4f     0x12      0x34      0x56

यदि संभव पहचानकर्ताओं (पहले दो अक्षर) का एक सीमित सेट है, तो आप इन्हें एक संख्या में एन्कोड कर सकते हैं और भेज सकते हैं (जब तक कि 256 से अधिक संयोजन न हों), जैसे:

IO -> 0x00
RD -> 0x01
WT -> 0x02
   ...
AB -> 0x10
   ...
ZZ -> 0xff

ताकि मूल स्ट्रिंग को सूचना के किसी भी नुकसान के बिना 4 बाइट्स में पैक किया जाए:

IO123456 -> 0x49 0x4f 0x31 0x32 0x33 0x34 0x35 0x36
              \    /     \   /     \   /     \   /
               0x00       0x12      0x34      0x56

बेशक इस प्रक्रिया को मूल आईडी स्ट्रिंग प्राप्त करने के लिए उलटा भी किया जा सकता है।


3

यदि स्ट्रिंग वर्णों का कोई भी क्रम हो सकता है:

  • यदि आप यह सुनिश्चित कर सकते हैं कि आपके तार प्रत्येक बाइट में सबसे महत्वपूर्ण बिट का उपयोग नहीं करते हैं, तो आप प्रत्येक को सात बिट तक काट सकते हैं और शेष 56 बिट्स को आपके द्वारा उपलब्ध 56 बिट्स में शिफ्ट करने के लिए बिटवाइज़ ऑपरेशन का उपयोग कर सकते हैं।

  • यदि तार केवल अक्षर और अंक हैं, तो उस सेट के 6-बिट प्रतिनिधित्व के साथ आएं और अपने पहचानकर्ता की 48-बिट स्ट्रिंग बनाएं।

यदि प्रारूप में हमेशा दो अक्षर होते हैं, जिसके बाद अंकों की एक स्ट्रिंग होती है:

  • पहले दो बाइट्स को अकेला छोड़ दें और संख्या को छह-बाइट पूर्णांक में एनकोड करें। IO123456बन जाता है 0x49 0x4f 0x01E240

  • पहले दो बाइट्स को अकेला छोड़ दें और अंकों को बाइनरी-कोडेड दशमलव के रूप में पैक करें । IO123456बन जाता है 0x49 0x4f 0x12 0x34 0x56


1

यहां पोस्ट किए गए प्रश्न के संदर्भ से, यह HART नामक कुछ औद्योगिक प्रोटोकॉल की ओर इशारा करता है। इस प्रोटोकॉल में ASCII वर्णों को लपेटने का एक अनूठा तरीका है। इसे पैक्ड-एएससीआईआई कहा जाता है। लेकिन फिर भी यह 8 अक्षरों को 4 में पैक नहीं करता है! पैक्ड-एएससीआईआई के अनुसार, 8 एएससीआईआई बाइट्स को 6. 4 से 3 और इतने पर परिवर्तित किया जाता है।

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


0

संभवतः '0123456' को एक लंबे पूर्णांक में परिवर्तित करके।

लेकिन यह केवल संख्यात्मक आईडी के लिए काम करेगा।

एक अन्य संभावित योजना आपके 7 से 6 बिट ईसीएमए -1 एन्कोडिंग को परिवर्तित करने की होगी जो आपको एक सिक्स बाइट स्ट्रिंग प्रदान करेगी लेकिन आप ऊपरी सेट अक्षर और सीमित विराम चिह्नों के सीमित सेट के वर्ण सेट तक सीमित रहेंगे।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.