echo bytes para um arquivo

41

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

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

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

x66x6fx6f

Então, as barras invertidas foram escapadas, mas não os bytes em si. Eu também tentei o mesmo apenas sem o -e desta vez, então eu teria exepected para ver \ x66 \ x6f \ x6f , mas tenho o mesmo de antes.

Então, echo está escapando de barras invertidas, de barras invertidas e de backslashes, independentemente de se é suposto. Alguma idéia de como consertar isso?
De acordo com o man-page que deveria ter feito o que estou procurando.

    
por Mark 05.03.2014 / 14:03

4 respostas

58

Você precisa colocar seus códigos entre aspas:

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

caso contrário, o shell substitui \x to x antes de ir para echo -e .

ps. dupla fuga também funcionará:

echo -n -e \x66\x6f\x6f > byteFileForNow
    
por 05.03.2014 / 14:13
5

Shell

No shell, você pode usar printf :

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

Nota: %b - Imprime o argumento associado enquanto interpreta as escapadas de contrabarra.

Perl

Com o perl, é ainda mais simples:

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

Python

Se você já instalou o Python, tente o seguinte one-liner:

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

Teste:

$ hexdump file.bin 
0000000 66 6f 6f 
    
por 14.06.2016 / 23:00
2

Isso pode não responder diretamente à pergunta, mas você também pode usar vi no modo hexadecimal:

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

Você poderá editar a parte hexadecimal (a parte do texto não será atualizada enquanto você altera a parte hexadecimal).

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

    
por 05.03.2014 / 14:19
2

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

man echo explica quais sequências de escape são permitidas. Aqui está um extrato.

   If -e is in effect, the following sequences are recognized:

   
   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
          %bl0ck_qu0te%nnn  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)
NNN 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

So \ x86 é apenas incorreto. deve ser octal e colocar sua string entre aspas duplas, caso contrário ela será interpretada pelo shell.

Exemplo:

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

Editar 1

Como Ouki me lembrou, o 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 torno de sua string para interromper o shell interpretando as barras invertidas.

%bl0ck_qu0te%     
por 05.03.2014 / 14:19