2011-11-26 15 views
9

पर बिट्स के स्ट्रिंग प्रस्तुति को परिवर्तित करना मैं बस फाइल संपीड़न के बारे में जानना शुरू कर रहा हूं और मैंने कुछ रोडब्लॉक में भाग लिया है। मेरे पास एक ऐसा एप्लीकेशन है जो "प्रोग्राम" जैसे एक संपीड़ित बाइनरी प्रतिनिधित्व "010100111111011000" (नोट यह अभी भी एक स्ट्रिंग के रूप में संग्रहीत है) के रूप में एक स्ट्रिंग को एन्कोड करेगा।एक बाइट

Encoding 
g  111 
r  10 
a  110 
p  010 
o  011 
m  00 

अब मैं एक FileOutputStream का उपयोग कर फाइल सिस्टम को यह लिखने के लिए की जरूरत है, समस्या मैं आ रही है, मैं कैसे एक byte[]/byte रों को स्ट्रिंग "010100111111011000" में बदल सकते हैं फ़ाइल के लिए लिखे जाने की FileOutputStream के साथ सिस्टम?

मैंने कभी भी बिट्स/बाइट्स के साथ काम नहीं किया है, इसलिए मैं यहां एक मृत अंत में हूं।

+0

आप "संपीड़ित बाइनरी प्रतिनिधित्व" के बारे में बात करते हैं तो कहें कि आपके पास एक 'स्ट्रिंग' है जो कि 18 वर्ण लंबा ("010100111111011000") है जो 7 वर्ण लंबा ("प्रोग्राम") शब्द का प्रतिनिधित्व करने के लिए है। क्या आप वाकई इसका मतलब है कि आप क्या पूछ रहे हैं? आम तौर पर आप उन बिट्स को एक्स बाइट्स (इस मामले में 3) में सेट करेंगे। –

+0

'बिट शिफ्ट ऑपरेटर' देखें: '>>', '>>>', '<<'। – Kevin

+0

ब्रायन, मूल संदेश 56 बिट आकार में है जब बाइनरी में अनुवाद किया गया है, एन्कोडेड संदेश केवल 18 बिट है। केविन, लोग मुझे यह कहते रहते रहते हैं, लेकिन मैं अभी भी उन ऑपरेटरों का उपयोग करने के बीच लिंक नहीं खींच सकता और इसे बाइट सरणी में अनुवाद करने में सक्षम हूं। –

उत्तर

6

बिट पारी ऑपरेटरों के लिए एक परिचय:

सबसे पहले, हम बाएं पारी ऑपरेटर x << n है,। , x >> n

 1111 1111 
<< 3: 1111 1000 

इसके बाद, हम पर हस्ताक्षर किए हैं राइट पारी ऑपरेटर: यह x में सभी बिट्स n बिट्स द्वारा छोड़ा परिवर्तन होगा, शून्य के साथ नए बिट्स भरने। यह n द्वारा x सही में सभी बिट्स बदलाव, नए बिट्स में संकेत बिट को कॉपी:

 1111 1111 
>> 3: 1111 1111 

     1000 0000 
>> 3: 1111 0000 

     0111 1111 
>> 3: 0000 1111 

अंत में, हम शून्य को भरने के सही-शिफ्ट ऑपरेटर, x >>> n है। यह सही n बिट्स द्वारा x में सभी बिट्स बदलाव, शून्य के साथ नए बिट्स भरने:

 1111 1111 
>>> 3: 0001 1111 

तुम भी उपयोगी साबित हो सकते बिटवाइज़-या ऑपरेटर, x | y।यह x और y में प्रत्येक स्थिति में बिट्स तुलना, अगर यह या तो x या y में पर था पर नया नंबर के बिट की स्थापना, अन्यथा बंद:

1010 0101 
| 1010 1010 
    --------- 
    1010 1111 

आप हाथ में समस्या के लिए पिछले ऑपरेटरों केवल आवश्यकता चाहिए , लेकिन पूर्णता के लिए के लिए, यहाँ पिछले दो हैं:

बिटवाइज़-और ऑपरेटर, x & y एक करने के लिए उत्पादन में बिट्स सेट करता है, तो और बिट दोनों x और y में पर है ही अगर:

1010 0101 
& 1010 1010 
    --------- 
    1010 0000 

बिटवाइज़-XOR ऑपरेटर, x^y एक करने के लिए उत्पादन बिट्स सेट करता है, तो थोड़ा अन्य लेकिन दोनों एक संख्या में चालू हो या:

1010 0101 
^ 1010 1010 
    --------- 
    0000 1111 

अब, हाथ में स्थिति के लिए इन लागू करने:

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

Our byte Target 
--------- -------- 
0000 0000 
      1100 1010 
0000 0001 ^
      1100 1010 
0000 0011 ^
      1100 1010 
0000 0110 ^
      1100 1010 
0000 1100 ^
      1100 1010 
0001 1001  ^
      1100 1010 
0011 0010  ^
      1100 1010 
0110 0101  ^
      1100 1010 
1100 1010   ^

मैं, ज़ाहिर है, यह आप पर छोड़ अपने काम करने के लिए इस लागू करने के लिए होगा।

+0

एक प्रश्न, 0000 0001 के रूप में अपना बाइट शुरू करने के लिए, यह बाइट बी = 1 लिखने जैसा ही है; ? मैं अनिश्चित हूं, बाइट की हस्ताक्षरित प्रकृति की वजह से, कैसे जानना है कि द्विआधारी प्रतिनिधित्व क्या है क्योंकि मुझे नहीं पता कि साइन का प्रतिनिधित्व करने वाला बिट क्या है। –

+0

आप ऐसा कर सकते हैं, लेकिन स्थिरता के लिए आप शून्य बाइट से शुरू करना चाहते हैं और फिर 'for' या' while' loop दर्ज करना चाहते हैं। मैं यह देखने के लिए थोड़ा सा उदाहरण संपादित करूंगा कि क्या मैं इसे थोड़ा और स्पष्ट कर सकता हूं। – Kevin

0

मुझे लगता है, आप इन शून्यों और लोगों को फ़ाइल में बाइनरी मानों के रूप में लिखना चाहते हैं। मैं ऐसा करता हूं, आप हर बार 8 स्ट्रिंग लेते हुए स्ट्रिंग को पुन: सक्रिय कर सकते हैं (String.substring() या smth) और बाइट (स्ट्रिंग) कन्स्ट्रक्टर के साथ बाइट बनाएं। यह अब तक का सबसे आसान समाधान है जो मेरे दिमाग में आता है।

यदि मैं समस्या के बारे में सही नहीं हूं, तो कृपया इसके बारे में और बताएं।

+0

मैंने यह कोशिश की, बाइट (स्ट्रिंग) कन्स्ट्रक्टर एक स्ट्रिंग "0011" लेगा और शाब्दिक रूप से इसे दशमलव संख्या 11 के रूप में व्याख्या करेगा। –

+0

यही कारण है कि आपको बाइट करना चाहिए (स्ट्रिंग एस, इंट रेडिक्स) बाइनरी रेडिक्स सेट करने के लिए कन्स्ट्रक्टर। –

1

String8 की लंबाई में ऊपर जाएं और Byte#parseByte पर कॉल करें। यदि आप radix से 2 पर सेट करते हैं, तो यह String को द्विआधारी संख्या के रूप में पार्स करेगा।

+1

धागे "अपवाद" में अपवाद java.lang.NumberFormatException: सीमा से बाहर मूल्य। मान: "10000000" रेडिक्स: 2 यह केवल 7 की लंबाई पर काम करता है जब तक कि अग्रणी शून्य नहीं हो, कोई विचार? –

+0

@ जॉन लोकाक्स मुझे नहीं पता कि यह क्यों कर रहा है, लेकिन आप ['इंटीजर # parseInt'] (http://tinyurl.com/7uo6b5t) का उपयोग कर सकते हैं और इसे वर्कअराउंड के लिए 'बाइट' पर डाल सकते हैं। – Jeffrey

+0

@jeff यह ऐसा इसलिए कर रहा है क्योंकि 'बाइट' पर हस्ताक्षर किए गए हैं, इसलिए इसे '111 1111'' -111 1111' (-128 से +127) होना चाहिए। '1000 0000' की बिट्स के साथ एक बाइट वास्तव में -128 है, और इसे पार्सर को' -1000 0000' के रूप में खिलाया जाना होगा। – Kevin

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