Rasberry Piをi2cバスを使用してディスプレイに接続しようとしています。手始めに、特にファイルにバイトなどを手動で書き込みたいと思いました。 ファイルに特定のバイトをどのように書き込むのですか? 私はすでにそのバイトを読んでおり、私の問題は次のようなもので解決する必要があると考えました
echo -n -e \x66\x6f\x6f > byteFileForNow
しかし、そのファイルをnanoで開くと、fooではなく、次のようになります。
x66x6fx6f
したがって、バックスラッシュはエスケープされましたが、バイト自体はエスケープされませんでした。今回も-eなしで同じことを試したので、\ x66\x6f\x6fですが、以前と同じです。
つまり、echoはバックスラッシュ、バックスラッシュのみ、バックスラッシュをエスケープします。
これを修正する方法はありますか?
私が探していることを実行する必要があるmanページによると。
コードを引用符で囲む必要があります。
echo -n -e '\x66\x6f\x6f' > byteFileForNow
それ以外の場合、シェルは\x
に移動する前に、echo -e
をx
に置き換えます。
ps。ダブルエスケープも機能します:
echo -n -e \\x66\\x6f\\x6f > byteFileForNow
シェルではprintf
を使用できます:
_printf "%b" '\x66\x6f\x6f' > file.bin
_
注:_%b
_-バックスラッシュエスケープの解釈中に関連する引数を出力します。
Perlを使用すると、さらに簡単になります。
_Perl -e 'print pack("ccc",(0x66,0x6f,0x6f))' > file.bin
_
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
_
これは質問に直接回答しない場合がありますが、16進モードでvi
を使用することもできます。
ファイルを開き、次のように入力します。[〜#〜] esc [〜#〜]:%!xxd
16進モードに切り替えます。
16進数部分を編集できます(16進数部分を変更してもテキスト部分は更新されません)。
完了したら、もう一度エスケープを押して、次のように入力します。[〜#〜] esc [〜#〜]:%!xxd -r
16進数モードで行った変更を書き戻す(後で保存することを忘れないでください)。
各コマンドのオンラインマニュアルには多くの情報があります。あきらめて質問を投稿する前に、それを一見する価値は常にあります。
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)