bir dosyaya eko bayt


46

Rasberry Pi'mi i2c veriyolunu kullanarak bir ekrana bağlamaya çalışıyorum. Başlamak için, özellikle bir dosyaya el ile şeyler, baytlar yazmak istedim. Bir dosyaya belirli baytları nasıl yazarsınız? Bunu çoktan okudum ve sorunumun böyle bir şeyle çözülmesi gerektiğini düşündüm

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

Ancak, o dosyayı nano ile açtığımda , foo yerine şunu görüyorum:

x66x6fx6f

Böylece ters eğik çizgiler kaçtı, ama baytların kendisi değil. Aynı zamanda sadece -e olmadan da denedim, bu yüzden \ x66 \ x6f \ x6f 'yi görmeyi beklerdim , ama eskisi gibi oldu.

Yani yankı ters eğik çizgilerden kaçıyor, tek başına ters eğik çizgi ve olması gerektiğinden bağımsız olarak ters eğik çizgi yapıyor.
Bunun nasıl düzeltileceği hakkında bir fikrin var mı?
Aradığım şeyi yapması gereken adam sayfasına göre.

Yanıtlar:


65

Kodlarınızı tırnak işaretleri altına almalısınız:

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

Aksi kabuk yerine geçer neden \xiçin xo gitmeden önce echo -e.

ps. çift ​​kaçış da işe yarayacak:

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

Ben tırnak ile çalışmak için aldım, ancak çift tırnak. Yeni bir şey, bariz bir şeydi. Teşekkürler!
Mark

Sadece yankı (genellikle) yerleşik bir kabuk komutu olduğu için dikkatli olun. Düzgün bashişlemek \xHH, ancak tüm kabukları yapmaz.
Ouki

5

Kabuk

Kabuk kullanabilirsiniz printf:

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

Not: %b- Ters eğik çizgi çıkışlarını yorumlarken ilgili argümanı yazdırın.

Perl

Perl ile daha da basittir:

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

piton

Python'u yüklediyseniz, aşağıdaki tek astarı deneyin:

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


Test yapmak:

$ hexdump file.bin 
0000000 66 6f 6f 

1
Ya da sadece perl -e 'print pack "c*", 0x66, 0x6f, 0x6f'ya daperl -e 'print pack "H*", "666f6f"'
Stéphane Chazelas 14:06

2
printf %b '\x66'Taşınabilir olmadığını unutmayın . printf '\x66'biraz daha taşınabilir ( ksh93hala ne ile dashne de ile çalışır yash). printf '\146\157\157'ya printf %b '\0146\0157\0157'da taşınabilir / standart olurdu.
Stéphane Chazelas 14:16

2

Bu doğrudan soruyu cevaplamayabilir, ancak vialtıgen modunda da kullanabilirsiniz :

Dosyanızı açın ve hex moduna geçmek için : ESC :%!xxd yazın.

Onaltılık kısmı düzenleyebileceksiniz (onaltılık kısmı değiştirdikçe metin kısmı güncellenmeyecek).

İşleminiz bittiğinde tekrar kaçış tuşlarına basın ve: Hex modunda yaptığınız değişiklikleri geri yazmak için ESC :%!xxd -r yazın (sonradan kaydetmeyi unutmayın).


2

Çevrimiçi kullanım kılavuzunda her komut için birçok bilgi vardır; Bir soruyu bırakmadan ve göndermeden önce buna bir göz atmaya her zaman değer.

man echoHangi kaçış dizilerine izin verildiğini açıklar. İşte bir özü.

   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

Bu yüzden \ x86 sadece yanlış. sekizlik olmalı ve dizginizi çift tırnak içine alınız, aksi takdirde kabuk tarafından yorumlanacaktır.

Örnek:

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

Düzenle 1

Ouki'nin bana hatırlattığı gibi, yankı aynı zamanda bir kabuk yerleşimidir, bu yüzden bilgiler bash kılavuz sayfasındadır man bash; İşte ilgili bölüm. Ancak , ters eğik çizgileri yorumlayan kabuğunu durdurmak için dizginizin " etrafında tırnak kullanın .

   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
Olan şey echogenellikle bir yerleşik komuttur. Yani bu kullandığınız kabuk kalmış. Linux varsayılanı bash; \xHHdüzgün bir karakter onaltılık değeriyle görüntülüyor.
Ouki

1
Kesinlikle haklısın, benim hatam. Düzenleme 1 güncellememe bakın.
X Tian
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.