echo bytes a un archivo


47

Estoy tratando de conectar mi Rasberry Pi a alguna pantalla usando el bus i2c. Para comenzar, quería escribir manualmente cosas, bytes en particular en un archivo. ¿Cómo se escriben bytes específicos en un archivo? Ya lo leí y pensé que mi problema debería resolverse con algo como esto

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

Sin embargo, cuando abro ese archivo con nano, en lugar de foo veo:

x66x6fx6f

Así que las barras invertidas se escaparon, pero no los bytes en sí. También intenté lo mismo solo sin -e esta vez, por lo que habría esperado ver \ x66 \ x6f \ x6f , pero obtuve lo mismo que antes.

Por lo tanto, el eco se escapa de las barras invertidas, las barras invertidas solo y las barras invertidas independientemente de si se supone que debe hacerlo.
¿Algúna idea de cómo arreglar esto?
Según la página de manual que debería haber hecho lo que estoy buscando.

Respuestas:


66

Tienes que llevar tus códigos entre comillas:

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

porque de lo contrario el shell reemplaza \xa xantes de ir a echo -e.

PD. doble escape también funcionará:

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

Lo hice para trabajar con comillas, comillas dobles sin embargo. Un poco nuevo, era algo obvio. ¡Gracias!
Mark

Solo tenga cuidado, ya que echo es (generalmente) un comando de shell incorporado. bashmanejar \xHHadecuadamente, pero no todas las conchas lo hacen.
Ouki

6

Cáscara

En shell puedes usar printf:

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

Nota: %b- Imprima el argumento asociado mientras interpreta los escapes de barra invertida.

Perl

Con perl, es aún más simple:

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

Pitón

Si tienes instalado Python, prueba el siguiente one-liner:

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


Pruebas:

$ hexdump file.bin 
0000000 66 6f 6f 

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

2
Tenga en cuenta que printf %b '\x66'no es portátil. printf '\x66'es un poco más portátil (funciona con ksh93, aún no con dashni yash). printf '\146\157\157'o printf %b '\0146\0157\0157'sería portátil / estándar.
Stéphane Chazelas

2

Es posible que esto no responda directamente a la pregunta, pero también puede usarlo vien modo hexadecimal:

Abra su archivo y escriba: ESC :%!xxd para cambiar al modo hexadecimal.

Podrá editar la parte hexadecimal (la parte de texto no se actualizará a medida que cambie la parte hexadecimal).

Cuando haya terminado, presione escapar nuevamente y escriba: ESC :%!xxd -r para escribir los cambios que realizó en modo hexadecimal (no olvide guardar después).


2

Hay mucha información en el manual en línea para cada comando; siempre vale la pena echarle un vistazo antes de rendirse y publicar una pregunta.

man echoexplica qué secuencias de escape están permitidas. Aquí hay un extracto.

   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

Entonces \ x86 es simplemente incorrecto. debe ser octal y poner su cadena entre comillas dobles, de lo contrario será interpretada por el shell.

Ejemplo:

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

Editar 1

Como me recordó Ouki, echo también es un shell incorporado, por lo que la información está en la página del manual para bash man bash; Aquí está la sección relevante. Pero use comillas " alrededor de su cadena para detener el shell que interpreta las barras diagonales.

   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
El problema es echoque generalmente es un comando incorporado. Entonces esto depende del shell que está utilizando. El ser predeterminado de Linux bash; \xHHmuestra correctamente un carácter a través de su valor hexadecimal.
Ouki

1
Tienes toda la razón, mi mal. Ver mi edición 1 actualización.
X Tian
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.