गूंज बाइट एक फ़ाइल के लिए


46

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

echo -n -e \x66\x6f\x6f > byteFileForNow

हालाँकि, जब मैं उस फ़ाइल को नैनो के साथ खोलता हूं, तो फू के बजाय मैं देखता हूं:

x66x6fx6f

इसलिए बैकस्लैश बच गए थे, लेकिन खुद बाइट्स नहीं। मैंने इस बार भी केवल -ई के बिना ही प्रयास किया , इसलिए मैं \ x66 \ x6f \ x6f देखने के लिए तैयार हो गया, लेकिन पहले जैसा ही था।

तो इको बैकस्लैश से बच रहा है, बैकस्लैश अकेले और बैकस्लैश अगर यह माना जाता है।
इसे ठीक करने के लिए कोई भी विचार?
मैन-पेज के अनुसार जो मुझे दिख रहा है उसे करना चाहिए था।

जवाबों:


65

आपको अपना कोड उद्धरणों में लेना होगा:

echo -n -e '\x66\x6f\x6f' > byteFileForNow

कारण अन्यथा शेल इससे पहले कि वह जाता है की जगह \xले लेता xहै echo -e

ps। डबल भागने से भी काम चलेगा:

echo -n -e \\x66\\x6f\\x6f > byteFileForNow

मुझे यह उद्धरण के साथ काम करने के लिए मिला, हालांकि दोहरे उद्धरण। मैं थोड़े नया था यह कुछ स्पष्ट था। धन्यवाद!
मार्क

गूंज के रूप में बस केफिर होना चाहिए (आमतौर पर) एक बिलियन शेल कमांड। ठीक से bashसंभाल \xHH, लेकिन सभी गोले नहीं करते हैं।
ओकी

5

खोल

शेल में आप उपयोग कर सकते हैं printf:

printf "%b" '\x66\x6f\x6f' > file.bin

नोट: %b- बैकस्लैश से बचने की व्याख्या करते समय संबंधित तर्क को प्रिंट करें।

पर्ल

पर्ल के साथ, यह और भी सरल है:

perl -e 'print pack("ccc",(0x66,0x6f,0x6f))' > file.bin

अजगर

यदि आपने पायथन स्थापित किया है, तो निम्न एक-लाइनर आज़माएँ:

python -c $'from struct import pack\nwith open("file.bin", "wb") as f: f.write(pack("<bbb", *bytearray([0x66, 0x6f, 0x6f])))'


परिक्षण:

$ hexdump file.bin 
0000000 66 6f 6f 

1
या सिर्फ perl -e 'print pack "c*", 0x66, 0x6f, 0x6f'याperl -e 'print pack "H*", "666f6f"'
स्टीफन चेज़लस

2
ध्यान दें कि printf %b '\x66'पोर्टेबल नहीं है। printf '\x66'थोड़ा और अधिक पोर्टेबल है (के साथ काम करता ksh93है, अभी भी नहीं के साथ dashहै और न ही yash)। printf '\146\157\157'या printf %b '\0146\0157\0157'पोर्टेबल / मानक होगा।
स्टीफन चेज़लस

2

यह सीधे सवाल का जवाब नहीं दे सकता है, लेकिन आप viहेक्स मोड में भी उपयोग कर सकते हैं :

अपनी फ़ाइल खोलें और टाइप करें: ESC :%!xxd को हेक्स मोड में स्विच करने के लिए।

आप हेक्स भाग को संपादित करने में सक्षम होंगे (पाठ भाग को अपडेट नहीं किया जाएगा क्योंकि आप हेक्स भाग को बदलते हैं)।

जब आपका काम फिर से भागने और हिट करने के लिए किया जाता है: हेक्स मोड में आपके द्वारा किए गए परिवर्तनों को वापस लिखने के लिए ESC :%!xxd -r (बाद में सेव करना न भूलें)।


2

प्रत्येक कमांड के लिए ऑनलाइन मैनुअल में बहुत सारी जानकारी है; यह हमेशा एक सवाल देने और पोस्ट करने से पहले उस पर ध्यान देने योग्य है।

man echoबताते हैं कि कौन से सीक्वेंस से बचने की अनुमति है। यहाँ एक उद्धरण है।

   If -e is in effect, the following sequences are recognized:

   \0NNN  the character whose ASCII code is NNN (octal)

   \\     backslash

   \a     alert (BEL)

   \b     backspace

   \c     produce no further output

   \f     form feed

   \n     new line

   \r     carriage return

   \t     horizontal tab

   \v     vertical tab

तो \ x86 सिर्फ गलत है। यह अष्टाधारी होना चाहिए और अपनी स्ट्रिंग को दोहरे उद्धरणों में रखना चाहिए, अन्यथा यह शेल द्वारा व्याख्या की जाएगी।

उदाहरण:

$ echo -e -n "\033\07\017" >tf
$ od -c tf
0000000 033  \a 017
0000003

संपादित करें 1

जैसा कि ओकी ने मुझे याद दिलाया, गूंज भी एक शेल बिल्डिन है, इसलिए जानकारी बैश के लिए मैनुअल पेज में है man bash; यहाँ एक प्रासंगिक अनुभाग है। लेकिन पीछे के स्लैश की व्याख्या करने वाले शेल को रोकने के लिए अपने स्ट्रिंग के चारों ओर उद्धरण का उपयोग करें "

   echo [-neE] [arg ...]
          Output  the  args, separated by spaces, followed by a newline.  The return status is always
          0.  If -n is specified, the trailing newline is suppressed.  If the  -e  option  is  given,
          interpretation  of  the  following  backslash-escaped characters is enabled.  The -E option
          disables the interpretation of these escape characters, even  on  systems  where  they  are
          interpreted  by  default.   The  xpg_echo shell option may be used to dynamically determine
          whether or not echo expands these escape characters by default.  echo does not interpret --
          to mean the end of options.  echo interprets the following escape sequences:
          \a     alert (bell)
          \b     backspace
          \c     suppress further output
          \e     an escape character
          \f     form feed
          \n     new line
          \r     carriage return
          \t     horizontal tab
          \v     vertical tab
          \\     backslash
          \0nnn  the eight-bit character whose value is the octal value nnn (zero to three octal dig
                 its)
          \xHH   the eight-bit character whose value is the hexadecimal value HH (one or two hex dig
                 its)

1
बात echoआमतौर पर एक अंतर्निहित आदेश है। तो यह आपके द्वारा उपयोग किए जा रहे शेल पर निर्भर है। लिनक्स डिफ़ॉल्ट होना bash; \xHHठीक से अपने हेक्साडेसिमल मूल्य के माध्यम से एक चरित्र प्रदर्शित कर रहा है।
Ouki

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