byte di eco in un file


46

Sto cercando di collegare il mio rasberry Pi ad alcuni display usando il bus i2c. Per iniziare volevo scrivere manualmente cose, byte in particolare su un file. Come si scrivono byte specifici in un file? L'ho già letto e ho pensato che il mio problema dovesse essere risolto con qualcosa del genere

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

Tuttavia, quando apro quel file con nano, invece di pippo vedo:

x66x6fx6f

Quindi le barre rovesciate sono sfuggite, ma non i byte stessi. Ho anche provato lo stesso solo senza -e questa volta, quindi mi sarei aspettato di vedere \ x66 \ x6f \ x6f , ma ho ottenuto lo stesso di prima.

Quindi l'eco sta sfuggendo a backslash, backslash da soli e backslash indipendentemente dal fatto che si supponga.
Qualche idea su come risolvere questo problema?
Secondo la man-page che avrebbe dovuto fare quello che sto cercando.

Risposte:


65

Devi prendere i tuoi codici tra virgolette:

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

perché altrimenti la shell viene sostituita \xda xprima di andare a echo -e.

ps. la doppia fuga funzionerà anche:

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

Ho capito che funziona con virgolette, doppie virgolette però. Un po 'nuovo era qualcosa di ovvio. Grazie!
Marco

Fai solo attenzione perché l'eco è (di solito) un comando shell incorporato. bashgestire \xHHcorrettamente, ma non tutte le shell.
Ouki,

5

Conchiglia

In shell puoi usare printf:

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

Nota: %b- Stampa l'argomento associato durante l'interpretazione degli escape di barra rovesciata.

Perl

Con perl, è ancora più semplice:

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

Pitone

Se hai installato Python, prova il seguente one-liner:

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


test:

$ hexdump file.bin 
0000000 66 6f 6f 

1
O semplicemente perl -e 'print pack "c*", 0x66, 0x6f, 0x6f'operl -e 'print pack "H*", "666f6f"'
Stéphane Chazelas il

2
Si noti che printf %b '\x66'non è portatile. printf '\x66'è leggermente più portatile (funziona con ksh93, ancora non con dashyash). printf '\146\157\157'o printf %b '\0146\0157\0157'sarebbe portatile / standard.
Stéphane Chazelas,

2

Questo potrebbe non rispondere direttamente alla domanda, ma puoi anche usare viin modalità esadecimale:

Apri il tuo file e digita: ESC :%!xxd per passare alla modalità esadecimale.

Sarai in grado di modificare la parte esadecimale (la parte di testo non verrà aggiornata quando cambi la parte esadecimale).

Al termine premere nuovamente Esc e digitare: ESC :%!xxd -r per riscrivere le modifiche apportate in modalità esadecimale (non dimenticare di salvare in seguito).


2

Ci sono molte informazioni nel manuale online per ogni comando; vale sempre la pena dare un'occhiata prima di rinunciare e pubblicare una domanda.

man echospiega quali sequenze di escape sono consentite. Ecco un estratto.

   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

Quindi \ x86 non è corretto. deve essere ottale e mettere la stringa tra virgolette doppie, altrimenti verrà interpretata dalla shell.

Esempio:

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

Modifica 1

Come mi ha ricordato Ouki, l'eco è anche una shell incorporata, quindi le informazioni sono nella pagina di manuale per bash man bash; ecco la sezione pertinente. Ma usa le virgolette " attorno alla stringa per impedire alla shell di interpretare le barre rovesciate.

   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
Il fatto echoè che di solito è un comando incorporato. Quindi dipende dalla shell che stai usando. L'impostazione predefinita di Linux bash; \xHHsta visualizzando correttamente un personaggio attraverso il suo valore esadecimale.
Ouki,

1
Hai assolutamente ragione, mia cattiva. Vedi il mio aggiornamento modifica 1.
X Tian
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.