क्या समतल पाठ डेटा को बाइनरी में समतुल्य संदेश संचय करने से कम जगह मिलती है?


32

एक वेब डेवलपर के रूप में मुझे बाइनरी डेटा की बहुत कम समझ है।

अगर मैं वाक्य "हैलो वर्ल्ड" लेता हूं, तो इसे बाइनरी में कनवर्ट करें, और इसे SQL डेटाबेस में बाइनरी के रूप में संग्रहीत करें, ऐसा लगता है कि 1s और 0s अक्षरों की तुलना में अधिक स्थान लेंगे। मुझे ऐसा लगता है कि अक्षरों का उपयोग करना संपीड़न के उपयोग की तरह होगा, जहां एक प्रतीक कई के लिए खड़ा है।

लेकिन क्या वास्तव में यह कैसे काम करता है?

क्या समतल पाठ डेटा को बाइनरी में समतुल्य संदेश संचय करने से कम जगह मिलती है?


126
आपको पूर्ण न्यूनतम नहीं पता है कि हर डेवलपर को चरित्र एन्कोडिंग के बारे में पता होना चाहिए । सौभाग्य से इस साइट के संस्थापक ने आपको एक लेख लिखा था। आप इसे फिर से प्रोग्राम करने से पहले पढ़ें। joelonsoftware.com/2003/10/08/…
एरिक

16
@EricLippert एक महान पढ़ा है और मैं एक परिणाम धन्यवाद के रूप में बेहतर हूँ।
जॉन डो


2
एक वेब डेवलपर होने के नाते एक बहाना नहीं है कि चरित्र एन्कोडिंग और बाइनरी डेटा कैसे काम करता है। आपको वास्तव में अपने कौशल को ब्रश करने की आवश्यकता है ...
टी। सर - पुनः स्थापित मोनिका

जवाबों:


134

प्लेनटेक्स्ट बाइनरी है।

जब आप Hहार्ड ड्राइव पर लिखते हैं, तो लिखने वाला सिर दो लंबवत रेखाओं और एक क्षैतिज रेखा को प्लैटर में नहीं रखता है, यह चुंबकीय रूप से बिट्स को प्लैटर में 010010001 एनकोड करता है ।

वहां से, यह स्पष्ट होना चाहिए कि सादे पाठ डेटा को संग्रहीत करने में द्विआधारी डेटा को संग्रहीत करने के समान स्थान होता है।

लेकिन प्लेनटेक्स्ट सिर्फ एक 2 विशेष बाइनरी प्रारूप है

प्लेनटेक्स को विपरीत रूप से अन्य बाइनरी प्रारूपों में बदला जा सकता है। एक सामान्य परिवर्तन संपीड़न है जो आमतौर पर एक अधिक कॉम्पैक्ट प्रतिनिधित्व के परिणामस्वरूप होता है, जिसका अर्थ है कि कम बिट्स का उपयोग उसी जानकारी का प्रतिनिधित्व करने के लिए किया जाता है।

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

उदाहरण के लिए, संख्या 5और 1234567अंकों अक्षरों का उपयोग, डिस्क पर इन बिट दृश्यों में जिसके परिणामस्वरूप प्लेन में प्रतिनिधित्व किया जा सकता है 3 :

00110101 00000000
00110001 00110010 00110011 00110100 00110101 00110110 00110111 00000000

वैकल्पिक रूप से, आप 32-बिट दो के पूरक का उपयोग कर सकते हैं :

00000000 00000000 00000000 00000101
00000000 00010010 11010110 10000111

जो कम कॉम्पैक्ट प्रतिनिधित्व है 5, लेकिन अधिक कॉम्पैक्ट प्रतिनिधित्व है 1234567

और वास्तव में अनंत संख्या में अन्य अभ्यावेदन होते हैं, जिनमें कॉम्पैक्टनेस और लचीलेपन के अलग-अलग स्तर होते हैं, हालांकि, व्यवहार में इससे कहीं कम वास्तव में कई अभ्यावेदन का उपयोग किया जाता है।


1 यूटीएफ -8 को मानते हुए। एक चरित्र के लिए बिट्स का सटीक क्रम इस बात पर निर्भर करता है कि आप किस विशिष्ट एन्कोडिंग का उपयोग कर रहे हैं।

2 या वास्तव में, कई प्रारूपों, विभिन्न एन्कोडिंगों को देखते हुए ।

3 यदि आप सोच रहे हैं कि उन आठ शून्य क्या हैं, ठीक है, तो आपको यह जानने का कोई तरीका चाहिए कि डेटा कितना लंबा है। विकल्प मूल रूप से एक मार्कर के लिए नीचे उबलते हैं (मैंने इसे एक नल बाइट के माध्यम से इस्तेमाल किया), अंतरिक्ष को स्टोर करने के लिए समर्पित लंबाई (पास्कल ने एक स्ट्रिंग की लंबाई को स्टोर करने के लिए एक बाइट का उपयोग किया), या एक निश्चित आकार (बाद के दो पूरक में इस्तेमाल किया गया) उदाहरण)।


6
एक मामूली अंतर एंड-ऑफ-लाइन का प्रतिनिधित्व है, जो यूनिक्स / बाइनरी में एक बाइट (एलएफ) लेता है जबकि विंडोज / टेक्स्ट में दो बाइट्स (सीआर-एलएफ) लगते हैं।
ग्लेन रैंडर्स-पीरसन

97
+1 के लिए "लिखने वाला सिर दो ऊर्ध्वाधर रेखाओं और
चापलूसी

@BaardKopperud आप सही हैं! ;)
ट्यूलेंस कोर्डोवा

2
@BaardKopperud नहीं है / था LightScribe , लेकिन वास्तव में कंप्यूटर पढ़ने, हालांकि शायद गूगल चश्मे की तरह कुछ कुछ LightScribe लेबल पढ़ सकता है के लिए नहीं किया गया था। लेकिन वास्तविक डेटा भंडारण पक्ष पर ऐसा करना काफी दिलचस्प होगा। एक आस्टसीलस्कप के माध्यम से चलने वाले फैंसी ग्राफिक्स वाले गीतों की याद दिलाता है ।
8 बिट्ट्री

2
@ TulainsCórdova हालांकि वास्तव में, ट्यूरिंग मशीनें एक मनमानी वर्णमाला पर काम करती हैं, इसलिए वे सिद्धांत में टेप पर पत्र लिख सकते हैं । यह सिर्फ इतना है कि हम दो-चिह्न वर्णमाला का उपयोग करने पर बसे हैं।
बागीचा २

15

मुझे यह सोचने में बड़ी मजेदार बात लगती है। बाइनरी 1 एस और 0 एस नहीं है जिस तरह से आप इसके बारे में बात करते हैं।

कल्पना कीजिए कि एक मात्रा है, मैं आपको बता सकता हूं कि यह कई अलग-अलग तरीकों से किस मात्रा में है:

  • Nine अंग्रेजी में
  • Neuf फ्रेंच में
  • 9 अरबी अंकों में
  • IX रोमन अंकों में
  • 1001 बाइनरी में अरबी अंकों के साथ
  • on off off on बाइनरी में ऑन / ऑफ के साथ
  • high low low high बाइनरी में वोल्टेज या लीवर या जल स्तर या विद्युत आवेश ... या अंग्रेजी शब्दों 'हाई' और 'लो' के साथ प्रतिनिधित्व किया

वे सभी एक ही चीज का प्रतिनिधित्व करते हैं। यहाँ बिंदु यह है कि बाइनरी 1s और 0s नहीं है, यह केवल एक मूल्य का प्रतिनिधित्व करने का एक तरीका है।

जब आप एच को बाइनरी में बदलने की बात करते हैं, तो आप शायद स्क्रीन पर 10101010 देखने की कल्पना करते हैं - लेकिन यह "बाइनरी" नहीं है, यह प्रत्येक बाइनरी बिट के लिए एक अंक है।

हाँ, यदि आप परिवर्तित H"बाइनरी" के रूप में लोगों को आम तौर पर इसके बारे में बात करते हैं, और उसके बाद का प्रतिनिधित्व किया है कि अरबी अंकों में और फिर इसे संग्रहित करने के लिए, यह अधिक स्थान उसी तरह से ले जाएगा कि परिवर्तित Hकरने के लिए aitchऔर अधिक स्थान लेता है।

लेकिन आप देख सकते हैं कि बाइनरी एक मात्रा का प्रतिनिधित्व करने का एक तरीका है, जो कि तर्क से "अच्छी तरह से" अगर मैंने एच को बाइनरी में बदल दिया और इसका प्रतिनिधित्व किया, high low high low high low high lowतो यह 35 वर्ण लेगा! यह और भी अधिक है 10101010! लेकिन ये दोनों 'बाइनरी' हैं। .. तो एक दूसरे से बड़ा कैसे है?

इस के दूसरी ओर आश्चर्य करने के लिए कैसे है Hएक कंप्यूटर द्वारा संग्रहीत है, और देखने के लिए कि Hएक ही मात्रा - खुद सिर्फ एक मात्रा का प्रतिनिधित्व करने का एक तरीका है 72, 01001000या seventy twoया ASCII वर्ण कोड H। कौन सा है कि सादा पाठ 8bittree का जवाब है है द्विआधारी, लेकिन यह मुझे क्या कि दिखाने की कोशिश है साधन

तो आपको कंप्यूटर में थोड़ा पैटर्न मिलता है 01001000और इसका क्या मतलब है? कुछ भी - एक संख्या के रूप में बात की जा सकती है, एक ज़िप फ़ाइल के एक भाग के रूप में, एक चरित्र के रूप में, यह निर्भर करता है कि इसे बनाने वाले व्यक्ति का इरादा क्या था। यदि आप जानते हैं कि यह सादा पाठ माना जाता है, तो यह एक चरित्र एन्कोडिंग से आया H-> 01001000और आप इसे वर्ण एन्कोडिंग तालिका में अन्य तरीके से देखते हैं - ASCII, UTF-8, shift-jis, आदि और सही फ़ॉन्ट ढूंढें चरित्र और बाहर एक Hया जो भी आता है । या यदि आप इसे उपयोग करने वाले व्यक्ति की तुलना में अलग एन्कोडिंग लुकअप का उपयोग करते हैं तो गलत चरित्र सामने आता है। यह @Eric Lippert का लिंक है।

लेकिन जैसा कि मैंने यह लिखा है, और जैसा कि आप इसके बारे में सोचते हैं, Hएक बाइट है और 010010008 बाइट्स है, हाँ यह अधिक जगह है। और हाँ यह (बाइनरी का प्रतिनिधित्व) है। लेकिन यह एब्सट्रैक्शन के उच्च स्तर पर है कि कंप्यूटर उपयोग कर रहा है - बाइनरी ASCII वर्णों में प्रदर्शित होता है, जहां प्रत्येक चरित्र को बाइनरी बिट पैटर्न के साथ पर्दे के पीछे दर्शाया जाता है, प्रत्येक Hअकेले जितना बड़ा होता है ।


12

क्या समतल पाठ डेटा को बाइनरी में समतुल्य संदेश संचय करने से कम जगह मिलती है?

नहीं कभी नहीं।

आपका कंप्यूटर पहले से ही बाइनरी प्रतिनिधित्व में सादे पाठ डेटा को संग्रहीत करता है। सादे पाठ बनाम बाइनरी के रूप में कुछ संग्रहीत करना केवल संकेत देता है कि कंप्यूटर को उस समान बाइनरी स्ट्रीम की व्याख्या कैसे करनी चाहिए ।

मुझे ऐसा लगता है कि अक्षरों का उपयोग करना संपीड़न के उपयोग की तरह होगा, जहां एक प्रतीक कई के लिए खड़ा है।

यह थोड़े सत्य है। एक चरित्र एक से अधिक बिट का प्रतिनिधित्व करेगा। समस्या यह है कि वे अलग-अलग आकार की चीजें हैं। एक सादे पाठ चरित्र को संग्रहित करने के लिए केवल 1 या 0, बल्कि 8 बिट्स (या अधिक) को संग्रहीत करने में एक बिट लगता है। आप वर्णों का उपयोग करके कुछ भी हासिल नहीं करते हैं।

यदि कुछ भी हो , तो आप चीजों को दूसरे तरीके से संपीड़ित कर सकते हैं। आखिरकार, 8 बिट्स 256 अलग-अलग संभावित मान हैं, फिर भी सादे पाठ आमतौर पर अक्षरों, संख्याओं और कुछ विराम चिह्नों तक सीमित हैं। इसके लिए कई बिट्स की जरूरत नहीं है।


3
खैर, शायद कभी-कभी :-) दो संभावित मामलों के बारे में मैं सोच सकता हूं। 1) आपके पास एक छोटा पाठ स्ट्रिंग है जिसे आप संक्षिप्त करते हैं। संपीड़ित फ़ाइल में कुछ मेटाडेटा होता है, जो संपीड़ित फ़ाइल को मूल स्ट्रिंग से बड़ा बनाता है। 2) आपके पास कुछ फ्लोटिंग पॉइंट वैल्यू हैं, 1.2 मानें। पाठ के रूप में भंडारण 3 बाइट्स (एक टर्मिनेटर के साथ 4) होगा, जबकि बाइनरी डबल स्टोर करने पर 8 बाइट्स होंगे।
jamesqf

5
जवाब वास्तव में 'बाइनरी' से आपके मतलब पर निर्भर करता है। उदाहरण के लिए, UTF-32 ASCII के रूप में ज्यादा स्थान के रूप में चार बार तक ले जाता है, इसलिए यदि 'सादा पाठ' द्वारा आप ASCII मतलब, और 'बाइनरी' द्वारा आप मतलब UTF-32, सादा पाठ होगा द्विआधारी से कम जगह लेने के। लेकिन आप परिभाषाओं को उलट सकते हैं और विपरीत परिणाम प्राप्त कर सकते हैं।
डेविड कॉनरैड

1
@DavidConrad खैर, कि "सादे पाठ जैसी कोई चीज नहीं है" पर सिर्फ स्कर्ट। आपके पास सबसे पास की चीज़ एक बाइनरी फ़ाइल है जिसमें बिना मेटाडेटा / हेडर के प्रकार की पहचान होती है और अनुमान लगाया जाता है कि "XXX के रूप में टेक्स्टकोड होना चाहिए!"। एक समय आया है जब "सादे पाठ फ़ाइल" का अर्थ सीमित संदर्भ में कुछ उचित था, लेकिन यह अब वास्तव में नहीं है। आपके द्वारा प्राप्त किया जा सकता सबसे अच्छा है "फ़ाइल के सभी डेटा को टेक्स्ट के रूप में एन्कोड किया गया है" इसके विपरीत "डेटा के कुछ / सभी भागों को टेक्स्ट के रूप में एन्कोड नहीं किया गया है"।
लुआं
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.