2012-12-14 7 views
5

का प्रतिनिधित्व करता है, मैं इस ./cprogram $(perl -e 'print "\xab\xcd\xef";') जैसे एक पर्ल स्क्रिप्ट के साथ एक सी प्रोग्राम में इनपुट फ़ीड करना चाहता हूं।मैं एक स्ट्रिंग वैरिएबल की व्याख्या कैसे कर सकता हूं जो पता

हालांकि, स्ट्रिंग को फ़ाइल से पढ़ा जाना चाहिए। तो मुझे ऐसा कुछ मिलता है: ./cprogram $(perl -e 'open FILE, "<myfile.txt"; $file_contents = do { local $/; <FILE> }; print $file_contents'। हालांकि, अब स्ट्रिंग स्ट्रिंग को "\xab\xcd\xef" स्ट्रिंग के रूप में व्याख्या करता है, और मैं इसे पहले उदाहरण के रूप में बाइट अनुक्रम के रूप में समझना चाहता हूं।

यह कैसे प्राप्त किया जा सकता है? फ़ाइल :: Slurp के बिना इसे सर्वर पर चलाना होगा।

उत्तर

5

पहले मामले में, आप तीन बाइट AB CD EF (स्ट्रिंग शाब्दिक "\xAB\xCD\xEF" द्वारा उत्पादित) print पर पास करते हैं।

दूसरे मामले में, आपको उन तीन बाइट्स के अलावा print पर कुछ और गुजरना होगा। मुझे संदेह है कि आप बारह वर्ण स्ट्रिंग \xAB\xCD\xEF से print पास कर रहे हैं।

तो आपका प्रश्न बन जाता है: कैसे बारह-वर्ण स्ट्रिंग \xAB\xCD\xEF को तीन बाइट्स AB CD EF में परिवर्तित करता है। ठीक है, आप के रूप में

s/\\x([0-9a-fA-F][0-9a-fA-F])|\\([^x])|([^\\]+)/ 
    $1 ? chr(hex($1)) : $2 ? $2 : $3 
/eg 

पार्सर इस तरह के किसी तरह का आवश्यकता होगी और यहाँ यह काम पर है:

perl -e "$(echo "print \"$(cat input)"\")" 

जिसके लिए अपने उदाहरण हो जाता है: एक बैश चाल का उपयोग कर

$ perl -e'print "\\xAB\\xCD\\xEF";' >file 

$ echo -n "$(perl -0777pe' 
    s{\\x([0-9a-fA-F][0-9a-fA-F])|\\([^x])|([^\\]+)}{ 
     $1 ? chr(hex($1)) : $2 // $3 
    }eg; 
    ' file)" | od -t x1 
0000000 ab cd ef 
0000003 
+0

क्षमा करें, एनयूएल बाइट सिर्फ मुझे सबसे कमजोर उदाहरण स्ट्रिंग टाइप कर रहा था। मेरे वास्तविक मामले में कोई एनयूएल बाइट नहीं है। – codd

+0

@ कोड, मैंने आपके प्रश्न से एनयूएल हटा दिया, और मैंने अपने उत्तर से संबंधित टिप्पणी हटा दी। मैंने थोड़ा सा स्पष्टीकरण भी फहराया। – ikegami

+0

देर से स्वीकार करने के लिए खेद है, पूरी तरह से इसके बारे में भूल गए। – codd

0

:

./cprogram "$(perl -e "$(echo "print \"$(cat myfile.txt)"\")")" 
+0

... वाह, मैंने अभी देखा है कि आप पूरी फ़ाइल हेक्स से बचने की उम्मीद करते हैं? यदि ऐसा है, तो मेरी पिछली टिप्पणी लागू नहीं होती है, लेकिन मुझे लगता है कि यह मानना ​​मुश्किल है। – ikegami

+1

सरल? './cprogram" $ (perl -0777pe '$ _ = eval qq {"$ _"}; $ @ @ myfile.txt $ @ @ @ – ikegami

0

क्या पर्ल का विकास भी ई है विल? यदि नहीं, print eval("\"$file_contents\"");

में समाप्त हो या आप पर्ल का उपयोग कर अग्रिम रूप से फ़ाइल तैयार कर सकते हैं? ईजी print FILE "\xAB\xCD\xED"; फिर परिणामस्वरूप फ़ाइल को अपने मौजूदा कोड के साथ पढ़ें।