2011-08-16 14 views
6

मेरे पास मानक इनपुट पर एक बाइनरी स्ट्रीम है, यह एक निश्चित आकार प्रारूप में है, पैकेट की एक सतत स्ट्रीम है, प्रत्येक पैकेट में लंबाई एक्स और एक शरीर लंबाई वाला वाई है।बैश/यूनिक्स टूलचेन बाइनरी स्ट्रीम प्रोसेसिंग/स्लाइसिंग

तो अगर एक्स = 2 वाई = 6 तो यह 00abcdef01ghijkl02mnopqr03stuvwx की तरह कुछ है, लेकिन यह द्विआधारी है और दोनों शीर्षक और डेटा किसी भी "वर्ण" शामिल कर सकते हैं ('\ 0' और न्यू लाइन सहित), उदाहरण के बस पठनीयता के लिए है ।

मैं हेडर डेटा से छुटकारा पाने के लिए चाहता हूं ताकि आउटपुट इस तरह दिखता हो: abcdefghijklmnopqrstuvwx

क्या यूनिक्स टूलचैन में कोई आदेश है जो मुझे ऐसा करने की अनुमति देता है? और सामान्य रूप से बाइनरी डेटा को संभालने के लिए कोई उपकरण हैं? एकमात्र उपकरण जिसे मैं सोच सकता हूं od/hexdump है लेकिन आप परिणाम को वापस बाइनरी में कैसे परिवर्तित करते हैं?

+0

इन नेटवर्क पैकेट हैं? टीसीपीडम्प के बारे में क्या? – AlG

उत्तर

3

xxd का उपयोग करें जो हेक्सडम्प से जाता है।

xxd -c 123 -ps 

प्रति स्ट्रीम 123 बाइट्स के साथ आपकी स्ट्रीम आउटपुट करेगा। उपयोग उल्टा करने के लिए

xxd -r -p 

अब आप इस एक साथ एक पंक्ति के अंत तक 3 से सभी पात्रों को पाने के लिए cut साथ डाल करने के लिए पात्रों ड्रॉप करने के बाद से आप की तरह

cut -c 3- 

कुछ कर सकते हैं सक्षम होना चाहिए। प्रति बाइट दो हेक्स वर्णों के लिए 2X के बराबर के बराबर वर्णों का उपयोग करना न भूलें।

तो

xxd -c X+Y -ps | cut -c 2X+1- | xxd -r -p 

जहां X+Y और 2X+1 की तर्ज पर कुछ वास्तविक संख्यात्मक मानों से बदल रहे हैं। आपको उपरोक्त आदेश में कहीं भी अपने डेटास्ट्रीम को उचित रखना होगा।

+0

तो विचार ठीक था .. 'xxd', इसके बारे में कभी नहीं सुना। धन्यवाद! नोट: कट '2X + 1' से है। –

1

पर्ल एक सुंदर मानक यूनिक्स उपकरण है। इसे पर्ल करने के लिए पाइप। यदि इसकी निश्चित लंबाई बाइट एक सरल सबस्ट्रेशन ऑपरेशन को गठबंधन किया जाना चाहिए। यहां एक पर्ल नमूना है जो काम करना चाहिए।

#!/usr/bin/env perl 

use strict; 
use warnings; 

my $buf; 
my $len = 8; 
my $off = 2; 
while(sysread(STDIN,$buf,$len) != 0){ 
    print substr($buf,$off); 
} 

exit 0; 

+0

आप एक समय में 8 बाइट पढ़ने के लिए 'my $ len = 8' चाहते हैं। –

+0

सच है, लेकिन कम से कम इसकी कॉन्फ़िगर करने योग्य;) – bot403

0

वहाँ भी bbe - binary block editor, जो बाइनरी डेटा से निपटने यूनिक्स रास्ता के लिए द्विआधारी sed की तरह है।

http://bbe-.sourceforge.net

1

एक एक लाइनर के रूप में, मैं लिखने चाहते हैं:

perl -00 -ne 'chomp; while (/(?:..)(......)/sg) {print $1}' 

उदाहरण:

echo '00abcdef01ghijkl02mnopqr03stuvw 
00abcdef01ghi 
kl02mnopqr' | perl -00 -ne 'chomp; while (/(?:..)(......)/sg) {print $1}' | od -c 

पैदा करता

0000000 a b c d e f g h i j k l m n o p 
0000020 q r s t u v w \n a b c d e f g h 
0000040 i \n k l m n o p q r 
0000052 
+0

अग्रणी न्यूलाइन 'echo -e "\ n00abcdef01 खाती है .." '। कोई उपाय? –

+0

@yi_H, हाँ, bot403 के ["sysread" उत्तर] (http://stackoverflow.com/questions/7080887/bash-unix-toolchain-binary-stream-processing-slicing/7081227#7081227) के साथ जाएं। –

0

बाइनरी धारा संपादक एक है जावा में लिखा उपकरण धाराओं को संभालने के लिए। इसका उपयोग जावा और कमांड लाइन से भी किया जा सकता है। https://sourceforge.net/projects/bistreameditor/

अस्वीकरण: मैं इस उपकरण का लेखक हूं।

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

bse.zip फ़ाइल को डाउनलोड और उपयोग किया जाना चाहिए। ऊपर के उदाहरण के लिए, हम केवल एक substr क्या करने की जरूरत होगी (2) लेन 8. के ​​इनपुट पर पूर्ण आदेश पंक्ति है

java -classpath "./bin:$CMN_LIB_PATH/commons-logging-1.1.1.jar:$CMN_LIB_PATH/commons-io-2.1.jar:$CMN_LIB_PATH/commons-jexl-2.1.1.jar:$CMN_LIB_PATH/commons-lang3-3.1.jar" 
-Dinputsrc=file:/fullpathtofile|URL|System.in 
-Dtraverser=org.milunsagle.io.streameditor.FixedLengthTraverser 
-Dtraversercons=size -Dtraverserconsarg0=8 
-Dbuffer=org.milunsagle.io.streameditor.CircularBuffer 
-Dbuffercons=size -Dbufferconsarg0=8 
-Dcommands='PRN V $$__INPUT.substring(2)' 
org.milunsagle.io.streameditor.BinaryStreamEditorInvoker 
संबंधित मुद्दे