2009-06-02 5 views
25

में द्विआधारी फ़ाइल लिखें क्या बाइनरी डेटा में बाइनरी डेटा लिखने का कोई आसान तरीका है जैसे कि हम सी/सी ++ में करते थे? उदाहरण के लिए, मैं फैंसी गणित का उपयोग किए बिना क्रमबद्ध 4-बाइट पूर्णांक मान के साथ 4-बाइट फ़ाइल कैसे बना सकता हूं?रूबी

उत्तर

29

आप Array#pack और String#unpack का उपयोग बाइनरी प्रस्तुतियों में कनवर्ट करने के लिए कर सकते हैं। उन्हें IO#write और IO#read के साथ संयोजित करें, और दूर जाएं।

+0

हां, मुझे लगता है कि इस विशेष प्रश्न के लिए आपका बेहतर जवाब है! +1 –

+0

उत्तर के लिए धन्यवाद, यह मेरे लिए काम किया। –

+3

ऐसा लगता है कि मैं क्या करना चाहता हूं, लेकिन मुझे अभी भी यह नहीं पता कि यह कैसे करना है। 'स्ट्रिंग # अनपैक' का उपयोग करने के लिए मुझे एक बाइनरी स्ट्रिंग को किस प्रारूप में अनपैक करना चाहिए? – mehulkar

3

Marshal.dump और Marshal.load तरीकों का उपयोग कर सकते हैं।

यहाँ एक कड़ी है: http://en.wikipedia.org/wiki/Serialization#Ruby

और एक और है कि एक फाइल करने के लिए डेटा की बचत होती है: http://rubylearning.com/satishtalim/object_serialization.html

+0

यह ठीक काम करता है, लेकिन मैं अभी भी नहीं 4 बाइट फ़ाइल इस का उपयोग कर प्राप्त कर सकते हैं: File.open ('test.bin', 'पश्चिम बंगाल') {| फ़ाइल | फ़ाइल << मार्शल डंप (12345)}, मुझे 6-बाइट फ़ाइल मिल रही है। समस्या है, मैं मालिकाना प्रारूप की एक बाइनरी फ़ाइल बनाने की जरूरत है कि, इस फाइल रिकॉर्ड के होते हैं उनमें से प्रत्येक पूर्णांकों, बाइट्स, आदि हालांकि बहुत जल्दी जवाब के लिए धन्यवाद के साथ निश्चित-लम्बाई सी शैली रिकार्ड है। –

+0

कोई चिंता नहीं। पेस्टो का जवाब बहुत ही आशाजनक दिखता है। –

0

मेरी विनम्र राय में, गहरे लाल रंग का इस तरह के कार्यों के लिए नहीं बनाया गया था। यदि आपको बाइनरी फाइलों को बहुत कुछ लिखना है, तो इसके लिए कुछ सी फ़ंक्शंस लिखना सबसे आसान होगा और उन्हें रूबी से कॉल करना होगा, जो स्विग का उपयोग करके काफी आसान है। मैं इस समय एक RAID सिम्युलेटर लिखने के लिए एक ही काम कर रहा हूँ।

+0

यह सही है - रुबी शायद अन्य सामानों के लिए थी, लेकिन हमारे पास पहले से ही एक बहुत बड़ा रेल एप्लिकेशन है और हमें बस बाइनरी फाइलों के साथ काम करने की आवश्यकता का सामना करना पड़ा। हालांकि आपके उत्तर के लिए धन्यवाद - हम सी/सी ++ में देशी एक्सटेंशन लिखने पर विचार कर सकते हैं। –

+0

सी/सी ++ में उन कार्यों को लिखने में समस्या यह है कि ऐसा करने से उन्हें एक विशिष्ट रूबी कार्यान्वयन में डाल दिया जा सकता है। Http://stackoverflow.com/questions/3292610/what-version-of-ruby/3294275#3294275 – sampablokuper

21

मुझे हाल ही में काम के लिए एक ही समस्या थी। मैंने BinData मणि का उपयोग किया और यह एक इलाज किया। तुम बस की तरह कुछ कार्य करें:

File.open('test.bin', 'wb') {|file| BinData::Int32be.new(12345).write(file) } 

और आप किसी भी Array#pack कोड याद करने की जरूरत नहीं।

+0

देखें धन्यवाद! अति उत्कृष्ट! अब मैं उत्सुक हूं कि यह मणि में कैसे कार्यान्वित किया गया है ... –

+0

मणि आपके लिए पैकिंग/अनपॅकिंग कर रहा है। स्रोत कोड [यहां] (https://github.com/dmendel/bindata)। जैसा कि उत्तर कहता है, यह आपको याद रखने के लिए रखता है कि कैसे/कौन से पैक कोड का उपयोग करना है – Andrea