2009-06-14 8 views
16

मैं फाइलों (जैसे कोर डंप) में बाइनरी डेटा का आसानी से विश्लेषण और छेड़छाड़ करने के लिए एक स्क्रिप्टिंग (या उच्च स्तरीय प्रोग्रामिंग) भाषा (या उदाहरण के लिए पाइथन या इसी तरह की भाषाओं के लिए मॉड्यूल) की तलाश में हूं, जैसे पर्ल टेक्स्ट फ़ाइलों को बहुत आसानी से जोड़ता है।बाइनरी के लिए कौन सी भाषा है, क्योंकि पर्ल टेक्स्ट है?

जो चीजें मैं करना चाहता हूं उनमें विभिन्न रूपों (बाइनरी, दशमलव, हेक्स) में डेटा के मनमानी हिस्सों को प्रस्तुत करना, एक अंतहीनता से दूसरे डेटा में डेटा परिवर्तित करना शामिल है। यही वह चीज है जो आप सामान्य रूप से सी या असेंबली का उपयोग करेंगे, लेकिन मैं एक ऐसी भाषा की तलाश में हूं जो अत्यधिक विशिष्ट, एक बार के उद्देश्यों के लिए कोड के छोटे टुकड़े लिखने की अनुमति देता है।

कोई सुझाव?

+2

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

+0

तारों को बाइनरी कास्टिंग करना आज मैं उपयोग करता हूं (पायथन या पर्ल में) लेकिन मुझे यह महसूस हो रहा है कि वहां ऐसा करने का कुछ आसान और अधिक शक्तिशाली तरीका होना चाहिए। इस सवाल में मैंने सी को जवाब देने का प्रयास करने के लिए सवाल संपादित किया। – ehdr

+1

यदि यह विशेष रूप से कोर डंप और सी प्रोग्रामिंग के बारे में है, तो आप जीएनयू बीएफडी भी देखना चाहेंगे: http://en.wikipedia.org/wiki/Binary_File_Descriptor_library – none

उत्तर

27

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

खैर, यह काउंटर सहज लग सकता है, जबकि, मैंने पाया erlang अत्यंत अर्थात् pattern matching के लिए अपने शक्तिशाली समर्थन की वजह से इस बात के लिए अच्छी तरह से अनुकूल है,, यहां तक ​​कि बाइट्स और बिट्स ("Erlang Bit Syntax" कहा जाता है) के लिए। कौन सा यह बहुत आसान भी बहुत उन्नत प्रोग्राम हैं जो एक byte- पर और यहां तक ​​कि एक बिट-स्तर पर निरीक्षण और डेटा जोड़ तोड़ के साथ सौदा बनाने के लिए बनाता है:

2001 के बाद से, कार्यात्मक भाषा Erlang एक बाइट उन्मुख डेटाप्रकार के साथ आता है (बाइनरी कहा जाता है) और बाइनरी पर मिलान पैटर्न बनाने के लिए संरचनाओं के साथ।

और informIT.com उद्धृत करने के लिए:

(Erlang) पैटर्न वास्तव में मिलान जब द्विआधारी प्रकार के साथ संयुक्त मज़ा पाने के लिए शुरू होता है। एक आवेदन पर विचार करें कि नेटवर्क से पैकेट प्राप्त करता है और फिर प्रक्रिया करता है। में चार बाइट्स एक पैकेट नेटवर्क बाइट-ऑर्डर पैकेट प्रकार पहचानकर्ता हो सकता है। एरलांग में, आप को केवल एक ही प्रक्रिया की आवश्यकता होगी पैकेट फ़ंक्शन जो इसे में आंतरिक प्रोसेसिंग के लिए डेटा संरचना में परिवर्तित कर सकता है। यह कुछ लगेगा इस तरह:

processPacket(<<1:32/big,RestOfPacket>>) -> 
    % Process type one packets 
    ... 
; 
processPacket(<<2:32/big,RestOfPacket>>) -> 
    % Process type two packets 
    ... 

तो, के साथ अपने में निर्मित पैटर्न मिलान के लिए समर्थन है और यह एक कार्यात्मक भाषा जा रहा है बहुत अर्थपूर्ण है, उदाहरण के लिए erlang में ueencode के कार्यान्वयन को देखने erlang:

uuencode(BitStr) -> 
<< (X+32):8 || <<X:6>> <= BitStr >>. 
uudecode(Text) -> 
<< (X-32):6 || <<X:8>> <= Text >>. 

एक परिचय के लिए, Bitlevel Binaries and Generalized Comprehensions in Erlang देखें।आप निम्न संकेत से कुछ बाहर की जाँच कर सकते हैं:

+0

बिल्कुल वही जो मैं सुझाव देने जा रहा था। Erlang बाइनरी डेटा के साथ बहुत अच्छी चीजें कर सकते हैं। – JesperE

+2

मैं इस पर –

+0

भयानक उत्तर पर भी erlang के साथ जाना होगा! बेहद गहन – ine

5

perl का pack और unpack?

+1

और Regexps जो बाइनरी पर खुशी से काम करते हैं - एक सुविधा मैंने दिन में अपने (एबी) उपयोग के माध्यम से वापस डीबग करने में मदद की। और यदि आप उस पर मिलान करना चाहते हैं तो आप बाइनरी को पैक/अनपैक कर सकते हैं। अपने यूनिकोड समर्थन के साथ हालिया कार्यान्वयन ने पानी को गड़बड़ कर दिया लेकिन मुझे लगता है कि यह सब बंद कर दिया जा सकता है। –

2

पैक/अनपैक फ़ंक्शंस के साथ कोई उच्च स्तरीय प्रोग्रामिंग भाषा होगी। सभी 3 पर्ल, पायथन और रूबी इसे कर सकते हैं। यह व्यक्तिगत वरीयता का मामला है। मैंने इनमें से प्रत्येक में बाइनरी पार्सिंग का थोड़ा सा लिखा और महसूस किया कि रूबी इस काम के लिए सबसे आसान/सबसे सुरुचिपूर्ण था।

2

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

मुझे हमेशा EiC पसंद आया है। यह मर चुका था, लेकिन परियोजना हाल ही में पुनरुत्थान किया गया है। ईआईसी आश्चर्यजनक रूप से सक्षम और उचित रूप से त्वरित है। CINT भी है। दोनों को विभिन्न प्लेटफार्मों के लिए संकलित किया जा सकता है, हालांकि मुझे लगता है कि सीआईएनटी को विंडोज़ पर सिग्विन की जरूरत है।

+0

यह मेरा विचार भी था। मुझे ईआईसी नहीं पता है, लेकिन सिंट एक ढीली बोली स्वीकार करता है (जब आप नए पेश किए गए चर के लिए प्रकार निर्दिष्ट नहीं करते हैं तो यह निश्चित रूप से (लेकिन अभी भी मजबूत) टाइपिंग करता है), जो मैक्रोज़ लिखते समय अधिक रैड शैली बनाता है। – dmckee

2

पायथन की मानक लाइब्रेरी में आपकी कुछ आवश्यकताएं हैं - array मॉड्यूल विशेष रूप से आपको बाइनरी फ़ाइलों के हिस्सों को आसानी से पढ़ने, एंडियननेस स्वैप आदि को पढ़ने देता है; struct मॉड्यूल बाइनरी तारों की बेहतर अनाज की व्याख्या के लिए अनुमति देता है। हालांकि, न तो आपको जितना समृद्ध है उतना समृद्ध है: उदाहरण के लिए, बाइट्स या आधे शब्दों के समान डेटा पेश करने के लिए, आपको इसे दो एरे के बीच कॉपी करने की आवश्यकता है (numpy तृतीय-पक्ष ऐड-ऑन उसी क्षेत्र की व्याख्या करने के लिए अधिक शक्तिशाली है स्मृति के कई अलग-अलग तरीकों से), और, उदाहरण के लिए, हेक्स में कुछ बाइट्स प्रदर्शित करने के लिए एक साधारण लूप या [hex(b) for b in thebytes[start:stop]] जैसी सूची समझ से परे कुछ भी "बंडल" नहीं है। मुझे लगता है आगे अभी तक इस तरह के कार्यों की सुविधा के लिए पुन: प्रयोज्य तीसरे पक्ष के मॉड्यूल देखते हैं, लेकिन मैं एक करने के लिए आप बात नहीं कर सकते हैं ...

3

मैं बाइनरी फ़ाइलें सभी बाइनरी फ़ाइलों को देखने के समय को देखना 010 Editor उपयोग कर रहा हूँ। यह विशेष रूप से बाइनरी फ़ाइलों के साथ काम करने के लिए तैयार है।

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

जब भी मैं एक बाइनरी फ़ाइल प्रारूप बनाता हूं, तो मैं फ़ाइलों को देखने के लिए हमेशा 010 संपादक के लिए एक छोटी सी स्क्रिप्ट करता हूं। यदि आपके पास कुछ structs के साथ कुछ शीर्षलेख फ़ाइलें हैं, तो बाइनरी फ़ाइलों के लिए पाठक बनाना मिनटों का मामला है।

0

यदि आप बाइनरी स्तर की प्रसंस्करण कर रहे हैं, तो यह बहुत कम स्तर है और संभवतः बहुत कुशल होने की आवश्यकता है और न्यूनतम निर्भरता/स्थापित आवश्यकताएं हैं।

तो मैं सी-हैंडल बाइट्स के साथ अच्छी तरह से जाऊंगा - और संभवतः आप बाइट्स को संभालने वाले कुछ लाइब्रेरी पैकेजों के लिए Google पर जा सकते हैं।

एरलांग जैसे कुछ के साथ जाकर अक्षमता, निर्भरता, और अन्य सामान जो आप शायद निम्न स्तर की लाइब्रेरी के साथ नहीं चाहते हैं, पेश करते हैं।

+0

दरअसल, गति मेरे लिए बहुत अधिक मुद्दा नहीं है, क्योंकि मैं अधिकतर इसे कुछ बाइनरी ब्लॉब (जैसे कोर डंप या स्ट्रीम से रिकॉर्ड किए गए डेटा) को "ब्राउज़" करने के लिए अधिकतर कम से कम अंतःक्रियात्मक रूप से उपयोग करने के लिए उपयोग करता हूं, एक आकार के साथ जिसे आमतौर पर मेगाबाइट्स में गिना जा सकता है। आपको सी के लिए ऐसे पुस्तकालय पैकेजों के बारे में पता नहीं है जो जांच के लायक हैं? – ehdr

1

फर्थ भी इस पर बहुत अच्छा हो सकता है, लेकिन यह थोड़ा सा आर्केन है।

+2

ए * बिट * आर्केन? :) –

4

python bitstring पर एक नजर डालें, तो यह की तरह लग रहा वास्तव में आप क्या चाहते हैं :)

1

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

तो बस उस डेटा पर पर्ल स्ट्रिंग प्रसंस्करण का उपयोग :)

4

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

उदाहरण के लिए:

>>> from bitstring import BitArray, ConstBitStream 
>>> s = BitArray('0x00cf')       # 16 bits long 
>>> print(s.hex, s.bin, s.int)      # Some different views 
00cf 0000000011001111 207 
>>> s[2:5] = '0b001100001'       # slice assignment 
>>> s.replace('0b110', '0x345')      # find and replace 
2             # 2 replacements made 
>>> s.prepend([1])         # Add 1 bit to the start 
>>> s.byteswap()          # Byte reversal 
>>> ordinary_string = s.bytes      # Back to Python string 

वहाँ भी bitstring में बिट के लिहाज से पढ़ने और नेविगेशन, ज्यादा फाइलों में की तरह के लिए कार्य कर रहे हैं; वास्तव में इस स्मृति में पढ़ने के बिना एक फ़ाइल से सीधे किया जा सकता है:

>>> s = ConstBitStream(filename='somefile.ext') 
>>> hex_code, a, b = s.readlist('hex:32, uint:7, uint:13') 
>>> s.find('0x0001')   # Seek to next occurence, if found 
True 

वहाँ भी अलग endiannesses के साथ-साथ और भी बहुत कुछ endianness स्वैप करने के लिए क्षमता के साथ विचार - manual पर एक नज़र डालें।

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