eco de bytes em um arquivo

46

Estou tentando conectar meu Rasberry Pi a algum monitor usando o barramento i2c. Para começar, eu queria escrever manualmente coisas, bytes em particular em um arquivo. Como você escreve bytes específicos em um arquivo? Eu já li esse e achei que meu problema deveria ser resolvido com algo assim

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

No entanto, quando abro esse arquivo com nano, em vez de foo , vejo:

x66x6fx6f

Portanto, as barras invertidas foram escapadas, mas não os bytes em si. Eu também tentei o mesmo apenas sem o ee desta vez, portanto, esperava ver \ x66 \ x6f \ x6f , mas obtive o mesmo de antes.

Portanto, o eco está escapando de barras invertidas, barras invertidas sozinhas e barras invertidas, independentemente de se pretender.
Alguma idéia de como consertar isso?
De acordo com a página de manual que deveria ter feito o que estou procurando.

Marca
fonte

Respostas:

65

Você deve colocar seus códigos entre aspas:

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

causar substitui outra forma de shell \xpara xantes que vá para echo -e.

ps. escape duplo também funcionará:

echo -n -e \\x66\\x6f\\x6f > byteFileForNow
pressa
fonte
Eu consegui trabalhar com aspas, aspas duplas. Eu meio que era novo, era algo óbvio. Obrigado!
Mark
Apenas tenha cuidado, pois o eco é (geralmente) um comando interno do shell. bashmanuseie \xHHcorretamente, mas nem todas as conchas o fazem.
Ouki
5

Concha

No shell você pode usar printf:

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

Nota: %b- Imprima o argumento associado ao interpretar escapes de barra invertida.

Perl

Com o perl, é ainda mais simples:

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

Pitão

Se você instalou o Python, tente o seguinte recurso:

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


Testando:

$ hexdump file.bin 
0000000 66 6f 6f 
kenorb
fonte
1
Ou apenas perl -e 'print pack "c*", 0x66, 0x6f, 0x6f'ouperl -e 'print pack "H*", "666f6f"'
Stéphane Chazelas
2
Observe que printf %b '\x66'não é portátil. printf '\x66'é um pouco mais portátil (funciona com ksh93, ainda não com dashnem yash). printf '\146\157\157'ou printf %b '\0146\0157\0157'seria portátil / padrão.
Stéphane Chazelas
2

Isso pode não responder diretamente à pergunta, mas você também pode usá-lo vino modo hexadecimal:

Abra seu arquivo e digite: ESC :%!xxd para alternar para o modo hexadecimal.

Você poderá editar a parte hexadecimal (a parte de texto não será atualizada à medida que você altera a parte hexadecimal).

Quando terminar, pressione escape novamente e digite: ESC :%!xxd -r para escrever de volta as alterações que você fez no modo hexadecimal (não esqueça de salvar depois).

Ouki
fonte
2

Há muitas informações no manual on-line para cada comando; sempre vale a pena dar uma olhada nisso antes de desistir e postar uma pergunta.

man echoexplica quais seqüências de escape são permitidas. Aqui está um extrato.

   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

Portanto, \ x86 está incorreto. deve ser octal e colocar sua string entre aspas duplas, caso contrário, será interpretada pelo shell.

Exemplo:

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

Editar 1

Como Ouki me lembrou, echo também é um shell embutido, então as informações estão na página de manual do bash man bash; aqui está a seção relevante. Mas use aspas " em sua string para impedir que o shell interprete as barras invertidas.

   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
fonte
1
A coisa é echogeralmente é um comando embutido. Portanto, isso depende do shell que você está usando. O padrão do linux sendo bash; \xHHestá exibindo corretamente um caractere através de seu valor hexadecimal.
Ouki
1
Você está absolutamente correto, meu mal. Veja minha edição 1 atualização.
X Tian