gema byte ke file

46

Saya mencoba menghubungkan rasberry Pi saya ke beberapa tampilan menggunakan bus i2c. Untuk memulai, saya ingin menulis barang secara manual, khususnya byte ke file. Bagaimana Anda menulis byte tertentu ke file? Saya sudah membaca yang itu dan saya pikir masalah saya harus diselesaikan dengan sesuatu seperti ini

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

Namun, ketika saya membuka file itu dengan nano, bukannya foo saya melihat:

x66x6fx6f

Jadi garis miring terbalik lolos, tetapi bukan byte itu sendiri. Saya juga mencoba yang sama hanya tanpa -e kali ini, jadi saya akan sudah diperiksa untuk melihat \ x66 \ x6f \ x6f , tetapi mendapatkan yang sama seperti sebelumnya.

Jadi gema melarikan diri backslash, backslash sendiri dan backslash terlepas dari apakah itu seharusnya.
Adakah cara untuk memperbaikinya?
Menurut halaman manual yang seharusnya melakukan apa yang saya cari.

Menandai
sumber

Jawaban:

65

Anda harus memasukkan kode Anda ke dalam tanda kutip:

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

menyebabkan Menggantikan jika shell \xuntuk xsebelum pergi ke echo -e.

ps. pelarian ganda juga akan bekerja:

echo -n -e \\x66\\x6f\\x6f > byteFileForNow
buru-buru
sumber
Saya berhasil menggunakan tanda kutip, dua tanda kutip. Saya agak baru itu sesuatu yang jelas. Terima kasih!
Markus
Berhati-hatilah karena echo (biasanya) adalah perintah shell builtin. bashmenanganinya \xHHdengan benar, tetapi tidak semua shell melakukannya.
Ouki
5

Kulit

Dalam shell Anda dapat menggunakan printf:

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

Catatan: %b- Cetak argumen yang terkait sambil menafsirkan lolos backslash.

Perl

Dengan perl, ini bahkan lebih sederhana:

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

Python

Jika Anda sudah memasang Python, coba langkah berikut:

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


Pengujian:

$ hexdump file.bin 
0000000 66 6f 6f 
kenorb
sumber
1
Atau hanya perl -e 'print pack "c*", 0x66, 0x6f, 0x6f'atauperl -e 'print pack "H*", "666f6f"'
Stéphane Chazelas
2
Perhatikan bahwa printf %b '\x66'ini tidak portabel. printf '\x66'sedikit lebih portabel (bekerja dengan ksh93, masih tidak dengan dashjuga yash). printf '\146\157\157'atau printf %b '\0146\0157\0157'akan portabel / standar.
Stéphane Chazelas
2

Ini mungkin tidak menjawab pertanyaan secara langsung, tetapi Anda juga dapat menggunakan vidalam mode hex:

Buka file Anda dan ketik: ESC :%!xxd untuk beralih ke mode hex.

Anda akan dapat mengedit bagian heks (bagian teks tidak akan diperbarui saat Anda mengubah bagian heks).

Ketika Anda selesai, tekan escape lagi dan ketik: ESC :%!xxd -r untuk menulis kembali perubahan yang Anda lakukan dalam mode hex (jangan lupa untuk menyimpan sesudahnya).

Ouki
sumber
2

Ada banyak informasi dalam manual online untuk setiap perintah; selalu ada baiknya melihat itu sebelum menyerah dan memposting pertanyaan.

man echomenjelaskan urutan pelarian mana yang diizinkan. Ini ekstraknya.

   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

Jadi \ x86 salah. itu harus oktal dan masukkan string Anda ke dalam tanda kutip ganda, jika tidak maka akan ditafsirkan oleh shell.

Contoh:

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

Edit 1

Sebagai Ouki mengingatkan saya, gema juga merupakan shell builtin, sehingga informasi yang di halaman manual untuk bash, man bash; inilah bagian yang relevan. Tetapi gunakan kutipan di " sekitar string Anda untuk menghentikan shell mengartikan garis miring.

   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)
X Tian
sumber
1
Masalahnya adalah echobiasanya perintah builtin. Jadi ini tergantung pada shell yang Anda gunakan. Linux defaultnya adalah bash; \xHHsecara benar menampilkan karakter melalui nilai heksadesimalnya.
Ouki
1
Anda benar sekali, salah saya. Lihat pembaruan edit 1 saya.
X Tian