web-dev-qa-db-ja.com

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

Rasberry Piをi2cバスを使用してディスプレイに接続しようとしています。手始めに、特にファイルにバイトなどを手動で書き込みたいと思いました。 ファイルに特定のバイトをどのように書き込むのですか? 私はすでにそのバイトを読んでおり、私の問題は次のようなもので解決する必要があると考えました

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

しかし、そのファイルをnanoで開くと、fooではなく、次のようになります。

x66x6fx6f

したがって、バックスラッシュはエスケープされましたが、バイト自体はエスケープされませんでした。今回も-eなしで同じことを試したので、\ x66\x6f\x6fですが、以前と同じです。

つまり、echoはバックスラッシュ、バックスラッシュのみ、バックスラッシュをエスケープします。
これを修正する方法はありますか?
私が探していることを実行する必要があるmanページによると。

51
Mark

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

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

それ以外の場合、シェルは\xに移動する前に、echo -exに置き換えます。

ps。ダブルエスケープも機能します:

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

シェル

シェルでは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 
_
6
kenorb

これは質問に直接回答しない場合がありますが、16進モードでviを使用することもできます。

ファイルを開き、次のように入力します。[〜#〜] esc [〜#〜]:%!xxd 16進モードに切り替えます。

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

完了したら、もう一度エスケープを押して、次のように入力します。[〜#〜] esc [〜#〜]:%!xxd -r 16進数モードで行った変更を書き戻す(後で保存することを忘れないでください)。

2
Ouki

各コマンドのオンラインマニュアルには多くの情報があります。あきらめて質問を投稿する前に、それを一見する価値は常にあります。

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)
2
X Tian