バイトをファイルにエコーする


46

i2cバスを使用して、rasberry Piをディスプレイに接続しようとしています。はじめに、特にバイトをファイルに手動で書き込みたいと思いました。 特定のバイトをファイルにどのように書き込みますか? 私はすでにそれを読んでいて、私の問題はこのようなもので解決されるべきだと考えました

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

ただし、fooではなくnanoでそのファイルを開くと、次のように表示されます。

x66x6fx6f

そのため、バックスラッシュはエスケープされましたが、バイト自体はエスケープされませんでした。また、今回は-eなしでのみ同じことを試みたので、\ x66 \ x6f \ x6fを表示することを期待していましたが、以前と同じになりました。

そのため、エコーはバックスラッシュ、バックスラッシュのみ、バックスラッシュをエスケープすることになっています。
これを修正する方法はありますか?
私が探していることを行うべきだったマニュアルページによると。

回答:


65

コードを引用符で囲む必要があります。

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

そうしないと、シェルは\xx進む前にに置き換えられecho -eます。

追伸 ダブルエスケープも機能します:

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

引用符、二重引用符で動作するようにしました。ちょっと新しいことは明らかだった。ありがとう!
マーク14年

エコーは(通常)組み込みのシェルコマンドなので、注意してください。適切にbash処理し\xHHますが、すべてのシェルが処理するわけではありません。
Ouki 14年

5

シェル

シェルでは次を使用できますprintf

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

注:%b-バックスラッシュエスケープを解釈しながら、関連する引数を出力します。

Perl

perlを使用すると、さらに簡単になります。

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

Python

Pythonをインストールした場合は、次のワンライナーを試してください。

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、16進モードで使用することもできます:

ファイルを開き、「ESC」 と入力 :%!xxdして、16進モードに切り替えます。

16進数部分を編集できます(16進数部分を変更しても、テキスト部分は更新されません)。

完了したら、もう一度エスケープキーを押して、16進モードで行った変更を書き戻すために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は正しくありません。8進数で、文字列を二重引用符で囲む必要があります。そうしないと、シェルによって解釈されます。

例:

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

編集1

Oukiが私に思い出させたように、echoもシェル組み込みコマンドなので、情報はbashのマニュアルページにあり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通常、組み込みコマンドです。したがって、これは使用しているシェル次第です。Linuxのデフォルトはbash; \xHH16進値で文字を適切に表示しています。
Ouki 14年

1
あなたは絶対に正しい、私の悪い。編集1の更新を参照してください。
Xティエン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.