2010-02-01 16 views
6

मेरे पास एक जावा प्रोग्राम है जो अंतरिक्ष से अलग हेक्साडेसिमल प्रारूप में, नेटवर्क पर प्राप्त कच्चे पैकेट के 16 बाइट्स में थूकता है। चूंकि मैं उस कोड को बदलना नहीं चाहता, इसलिए मैं परिणाम को पर्ल स्क्रिप्ट पर पाइप कर रहा हूं, सैद्धांतिक रूप से, unpack यह STDIN से पहचानने योग्य चर में हो सकता है। निम्नलिखित मेरी पर्ल फाइल करने के लिए लाइन इनपुट का एक नमूना है:पर्ल में अनपॅक किए गए स्पेस से अलग एसटीडीआईएन हेक्स स्ट्रिंग्स को मैं कैसे पार्स कर सकता हूं?

 
FF FF 09 7D 10 01 07 01 00 02 00 1D 00 00 00 00 00 06 00 07 00 
|--garbage-----|c--|c--|int---|int---|int---|int---|int---|int---|int---| 

मैं शुरू में unpack उपयोग करने के लिए सफाई से प्रत्येक इनपुट को अलग करना चाहता था (ग, 16bit पूर्णांक चर के लिए पूर्णांक चार/बाइट के लिए है) मुझे आवश्यक चर में लाइन। हालांकि, स्ट्रिंग में स्पेस डिलीमिट की वजह से, मुझे यकीन नहीं है कि इसे कैसे संभाला जाए (मैं 'ए' को टेम्पलेट के रूप में उपयोग कर सकता हूं, लेकिन फिर भी मैं स्प्लिट का उपयोग कर सकता हूं!)

क्या कोई शानदार तरीका है unpack() का उपयोग करने के लिए? मैं एक पर्ल मास्टर नहीं हूं, लेकिन दूसरा तरीका है, जैसा कि मैंने पहले सुझाव दिया था, split का उपयोग करें और फिर प्रत्येक हेक्स को बाइट में मैन्युअल रूप से परिवर्तित करें, और उसके बाद मैं जो चाहता हूं उसे प्राप्त करने के लिए बिट मैनिपुलेशन और मास्क का उपयोग करें। कोई अन्य सुझाव (यदि unpack दिन बचा नहीं है)?

उत्तर

8

मानते हुए उन ints बड़े endian क्रम में हैं, का उपयोग

#! /usr/bin/perl 

use warnings; 
use strict; 

# for demo only 
*ARGV = *DATA; 

while (<>) { 
    my @fields = unpack "x5C2n7", 
       pack "C*", 
       map hex, split; 

    print "[", join("][" => @fields), "]\n"; 
} 

__DATA__ 
FF FF 09 7D 10 01 07 01 00 02 00 1D 00 00 00 00 00 06 00 07 00 

यह बाइट (C*) उनके मूल्यों के अनुसार पैकिंग द्वारा बंद शुरू होता है।

:

  • x5 पांच बाइट्स
  • C2 डीकोड दो unsigned char मूल्यों
  • n7 डीकोड सात 16-बिट बड़े endian अहस्ताक्षरित पूर्णांकों

आउटपुट को छोड़ देता है: unpack टेम्पलेट निम्नलिखित भागों में है

$ ./dump-packets 
[1][7][256][512][7424][0][0][1536][1792]
+0

आप इसे 'मैप {हेक्स} स्प्लिट' कहकर सुंदर दिख सकते हैं :) – friedo

+2

या यहां तक ​​कि सिर्फ 'नक्शा हेक्स, विभाजन' - लगभग हास्केल! –

+0

असल में मैंने पुष्टि की कि बाइट थोड़ा एंडियन में हैं। wierd, क्योंकि वे एक नेटवर्क पर भेजे जाते हैं, मैंने सोचा होगा कि नेटवर्क आदेश में होना चाहिए था। ओह ठीक है, फिर एकमात्र परिवर्तन "x5C2n7" को अनपैक करने के लिए "x5C2n7" अनपैक करने की आवश्यकता है, है ना? और उत्तर के लिए धन्यवाद ... यह मंच अद्भुत है – intiha

3

यदि आप अनपॅक किए गए डेटा पर अनपैक का उपयोग करना चाहते हैं, तो आपको इसे पहले पैक करना होगा। और आपको ऐसा करने से पहले रिक्त स्थान को हटाने की आवश्यकता होगी।

दूसरे शब्दों में,

$line =~ tr/ //d;   # remove spaces 
$line = pack 'H*', $line; # convert hex to binary 
# Now you can use unpack. 
+0

मैं वास्तव में आप इसके समाधान के कारण इस समाधान को देखा गया (मुझे समझ में आया कि कोड क्या कर रहा था) ऊपर बताए गए अनपॅकिंग के साथ संयुक्त। और यदि जावा कोड एक त्रुटि स्ट्रिंग थूकता है तो मैं $ line को भी पार्स कर सकता हूं। – intiha

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

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