बाइनरी प्रसंस्करण के लिए एक शेल जैसा वातावरण


15

यह सवाल मेरे सामने कुछ समय पहले आया था, अब सवाल के जवाब में /programming/993434/what-language-is-to/binary में दिए गए बैश आंसरों में स्टैन्ड से बाइनरी डेटा चंक्स के माध्यम से लूप। -स-पेरल-से-टू-टेक्स्ट भी संतोषजनक नहीं थे।

मैं बाइनरी फ़ाइलों के साथ I / O को संभालने के लिए विशेष रूप से अनुकूल एक स्क्रिप्टिंग वातावरण की तलाश कर रहा हूं। मुझे पता है कि मैं पूरी तरह से विकसित प्रोग्रामिंग भाषाओं (c / Python / ...) में से एक का उपयोग कर सकता हूं, लेकिन उनके पास एक बहुत बड़ा इनिशियलाइज़ेशन और कोडिंग ओवरहेड है (c में आवंटन और fread / fwrite, Python में बिटस्ट्रिंग ...) का उल्लेख नहीं करना वे स्क्रिप्टिंग के लिए कम उपयुक्त हैं (अन्य एप्लिकेशन को कॉल करना)। पर्ल अपने unpackकार्यों, स्ट्रिंग-उन्मुख ऑपरेशन और नासमझ सिंटैक्स के साथ बेहतर नहीं है ।

कुछ-कुछ od, लेकिन एक भाषा के रूप में।

मुझे क्या उम्मीद है:

  1. एकल स्विच / कमांड के साथ एंडियननेस सेट करें या बदलें।
  2. अनुरोध किया प्रकार के सरल विनिर्देश (बैश विस्तार की तरह कुछ read varके साथ int32 var, float varआदि)।
  3. पाइपों के माध्यम से बाइनरी की हैंडलिंग, बाइट्स की निर्दिष्ट संख्या को लंघन।
  4. मानक स्क्रिप्टिंग प्रवाह नियंत्रण (के लिए / अगर / ...) जिसका हम उपयोग करते हैं।

मैं कच्चे डेटा (फोटोग्राफी, वैज्ञानिक डेटा, अज्ञात और खराब दस्तावेज वाले प्रारूप) को उसी आसानी और अंतर्दृष्टि के साथ संसाधित करना चाहता हूं जो आपको ASCII फ़ाइलों का निरीक्षण करते समय मिलता है। मैं अभी उपयोग कर रहा हूं c, लेकिन यह तदर्थ स्क्रिप्टिंग के लिए इष्टतम नहीं है, और इंटरैक्टिव नहीं हो सकता है।

किसी को भी इस तरह एक उपकरण पता है? कोई Clicky GUI सॉफ़्टवेयर नहीं, कृपया, इसे ssh पर काम करने की ज़रूरत है, अन्य लिपियों से और इसी तरह। "मौजूद नहीं है" एक स्वीकार्य, लेकिन निराशाजनक जवाब है।


2
यह दूर स्टार्टअप समय के दर्द को नहीं ले करता है, लेकिन मैं अजगर 3.3 से बाइट्स मिल जाए, एक साथ के साथ सीसा बहुत व्यावहारिक: chain = ls["-a"] | grep["-v", "\\.py"] | wc["-l"]; chain()आपको लगता है कि पर ध्यान दिया है?
एंथन

आप अपने पास मौजूद C कोड ले सकते हैं और इसे कमांड-लाइन टूल के एक सेट में बदल सकते हैं, जिसे आप bash स्क्रिप्ट में उपयोग कर सकते हैं। जब आप बाइनरी को शेल वैरिएबल में नहीं डाल सकते हैं, तो आप इसे नामांकित ('पंद्रो') पाइप में दबा सकते हैं; जब तक आप उन्हें पढ़ना नहीं चाहते, उनकी सामग्री को स्मृति में रखा जाता है।
गोल्डिलॉक्स

1
आपके तर्क WRT अजगर और पर्ल, BTW में एक गंभीर दोष है। जबकि व्यक्तिगत कमांड लाइन उपकरण संकलित किए गए हैं, शेल स्क्रिप्ट नहीं हैं और इसमें बहुत अधिक फोर्किंग शामिल है (यदि आप महंगा चाहते हैं, तो फोर्किंग यह है)। आपकी चर्चा, अन्य प्रश्न, आदि, यदि आप द्विआधारी को संभाल सकते हैं, तो आप ठीक w / bash का उपयोग करेंगे। पायथन और पर्ल स्क्रिप्ट दोनों पूर्व-संकलित हैं। यदि आप एक समान रूप से जटिल अजगर या समानांतर स्क्रिप्ट बनाम समानांतर बैश स्क्रिप्ट को बेंचमार्क करते हैं, तो पर्ल या अजगर तेजी से परिमाण का एक क्रम होगा । यदि आप मुझ पर विश्वास नहीं करते हैं, तो इसके विपरीत सबूत के लिए वेब पर खोज करने के लिए आपका स्वागत है।
सुनिलॉक

मैं एक उपकरण की तलाश नहीं कर रहा हूं जो तेजी से चलता है, मैं कुछ ऐसा ढूंढ रहा हूं जो मैं तेजी से कोड कर सकता हूं । उदाहरण के लिए, यदि मेरे पास एक अजीब कार्यक्रम है जो संरचना के सरणी आकार (इंट, फ्लोट, फ्लोट) के लिए एक द्विआधारी इंट का उत्पादन करता है जो इसके बाद आता है, मैं सरणी सरणी पर सरणी आकार और लूप को जल्दी से पढ़ना चाहूंगा, संभवतः कुछ की गणना करना। कुछ घटकों के संचयी या अधिकतम, या केवल एक घटक को gnuplot प्रसंस्करण के लिए ascii स्तंभ के रूप में प्रिंट करें। एंथन: धन्यवाद, मुझे इस बारे में पता नहीं था, यह उपयोगी होगा। गोल्डीलॉक्स: मैं उससे बचने की कोशिश कर रहा हूं, लेकिन मैं अंत में अपना खुद का टूल लिख सकता हूं :)
orion

2
लगता है जैसे आपको perl's unpack(
St

जवाबों:


2

मुझे वर्षों से आपके साथ भी यही समस्या है।

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

बेशक , टेक्स्ट-आधारित टूल के साथ डेटा को संपादित करने xxdसे पहले और xxd -rबाद में कोई भी उपयोग कर सकता है , लेकिन यह तब काम नहीं करेगा जब प्रश्न में डेटा बड़ा हो और यादृच्छिक एक्सेस की आवश्यकता हो, उदाहरण के लिए ब्लॉक डिवाइसों को संसाधित करते समय।

(नोट: विंडोज के लिए, कम से कम महंगी, मालिकाना WinHex स्क्रिप्टिंग भाषा है, लेकिन यह हमें कहीं भी नहीं मिलेगी।)

अधिक जटिल द्विआधारी संपादन के लिए, मैं आमतौर पर अजगर के रूप में अच्छी तरह से वापस आ जाता हूं, भले ही यह कभी-कभी बड़ी फ़ाइलों के लिए बहुत धीमा हो, जो कि मुख्य दोष है। मुझे उम्मीद है कि पिस्टन (पाइथन एलएलवीएम को अनुकूलित मशीन कोड के लिए संकलित करने के लिए नियोजित करेगा) किसी दिन पर्याप्त रूप से उपयोग करने योग्य होगा, या इससे भी बेहतर, कोई व्यक्ति एक नि: शुल्क कॉम्पैक्ट, तेज और बहुमुखी बाइनरी प्रोसेसिंग स्क्रिप्टिंग भाषा को डिजाइन और कार्यान्वित करेगा, जो AFAIK के लिए मौजूद नहीं है। यू * IX जैसे सिस्टम अभी तक।

अपडेट करें

मैं होमब्रे, ओपन सोर्स इंटेल x86 असेंबलर फ्लैट असेंबलर , या शॉर्ट के लिए फ़ेस का उपयोग करने के लिए भी होता हूं , जो कि सिर्फ एक असेंबलर की तुलना में अधिक विकसित हुआ।

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

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

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

यह कुछ रफ किनारों की तरह है

  1. संगामिति का समर्थन नहीं

  2. 32 बिट x86 असेंबली में लेखन किया जा रहा है (हालांकि x86_64 पर काम करता है), आपको शायद qemu या इसी तरह के एमुलेटर की आवश्यकता है यदि आप इसे x86 या x86_64 के अलावा किसी और चीज़ पर चलाना चाहते हैं

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

  4. आउटपुट फ़ाइल में लिखे जाने वाले सभी डेटा को मेमोरी में "फ्लैट" बफर में किया जाता है, और यह बफर बढ़ सकता है लेकिन तब तक सिकुड़ता नहीं है जब तक आउटपुट फाइल लिखा नहीं जाता है और फेसम समाप्त हो जाता है। इसका मतलब यह है कि कोई केवल उन फ़ाइलों को अधिक से अधिक उत्पन्न कर सकता है जिनके पास आपके पास मुख्य स्मृति शेष है जो कि एक ही रन ऑफ़ फ़ासम में है।

  5. डेटा केवल फ़ेस के प्रत्येक रन के लिए एकल आउटपुट फ़ाइल में लिखा जा सकता है

  6. हाँ, यह homebrew है, हालांकि एक बहुत साफ और चालाक है


2

आपको जरूरी नहीं कि पर्ल के अनपैक के साथ "शांति बनाना" हो ... पर्ल के बारे में एक बड़ी बात यह है कि आप कस्टम पैकेज में अपनी भाषा बनाने के लिए पार्सर और सिंबल टेबल का दुरुपयोग कैसे कर सकते हैं।

क्या यह मूल रूप से आप के लिए देख रहे हैं?

use MyBinLib;
my $struct= struct(
  pack => 8,
  size => 400,
  fields => [int32('foo','bar','baz'), float32('x1','x2','x3','x4'), int8, int8, int16('z')]
);
while (my $rec= $struct->read(<STDIN>)) {
  printf "x1 = %d, x2 = $d\n", $rec->x1, $rec->x2;
}

व्यायाम तो MyBinLib पैकेज लिखने के लिए पर्याप्त प्रति सीखने के लिए है। एक पर्ल फोरम में पूछें और लोगों को शायद मदद करने में खुशी होगी।


1

क्या आपके beavपास मैक्रोज़ हैं, लेकिन मुझे स्क्रिप्टिंग नहीं मिली,

apt-cache show beav अर्क:

बीमे के साथ, आप HEX, ASCII, EBCDIC, OCTAL, DECIMAL, और BINARY में एक फ़ाइल संपादित कर सकते हैं। आप FLOAT मोड में डेटा प्रदर्शित नहीं कर सकते हैं लेकिन संपादित नहीं कर सकते हैं। आप इनमें से किसी भी मोड में खोज या खोज कर सकते हैं। डेटा को BYTE, WORD, या डबल वर्ड प्रारूप में प्रदर्शित किया जा सकता है। WORDS या DOUBLE WORDS को प्रदर्शित करते समय डेटा को INTEL या MOTOROLA के बाइट ऑर्डर में प्रदर्शित किया जा सकता है। किसी भी लम्बाई का डेटा फ़ाइल के किसी भी बिंदु पर डाला जा सकता है। इस डेटा का स्रोत कीबोर्ड, दूसरा बफर या एक फ़ाइल हो सकता है। प्रदर्शित किया जा रहा है कि किसी भी डेटा को प्रदर्शित प्रारूप में एक प्रिंटर के लिए भेजा जा सकता है। मेमोरी से बड़ी फ़ाइलों को हैंडल किया जा सकता है।

तो फिर वहाँ है xxdजो बाइनरी / ascii प्रदर्शन मोड से / में धर्मान्तरित और के साथ एक साथ जोड़ा जा सकता है sedया vi, लेकिन बाइट सुविधा की अदला-बदली नहीं मिला है।


0

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

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