web-dev-qa-db-fra.com

écho octets dans un fichier

J'essaie de connecter mon rasberry Pi à un écran à l'aide du bus i2c. Pour commencer, je voulais écrire manuellement des trucs, notamment des octets dans un fichier. Comment écrivez-vous des octets spécifiques dans un fichier? J'ai déjà lu celui-ci et j'ai pensé que mon problème devrait être résolu par quelque chose comme ça

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

Cependant, lorsque j'ouvre ce fichier avec nano, au lieu de foo je vois:

x66x6fx6f

Ainsi, les barres obliques inverses ont été échappées, mais pas les octets eux-mêmes. J'ai également essayé la même chose sans ( - e cette fois, donc je me serais attendu à voir \x66\x6f\x6f , mais a obtenu la même chose qu'avant.

L'écho échappe donc aux barres obliques inverses, aux barres obliques inverses seules et aux barres obliques inverses, peu importe si c'est censé le faire.
Une idée de comment résoudre ce problème?
Selon la page de manuel qui aurait dû faire ce que je cherchais.

51
Mark

Vous devez prendre vos codes entre guillemets:

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

sinon Shell remplace \x à x avant de passer à echo -e.

ps. double escape fonctionnera également:

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

Coquille

Dans Shell, vous pouvez utiliser printf:

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

Remarque: %b - Imprimez l'argument associé lors de l'interprétation des échappements antislash.

Perl

Avec Perl, c'est encore plus simple:

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

Python

Si vous avez Python installé, essayez le one-liner suivant:

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


Essai:

$ hexdump file.bin 
0000000 66 6f 6f 
6
kenorb

Cela peut ne pas répondre directement à la question, mais vous pouvez également utiliser vi en mode hexadécimal:

Ouvrez votre fichier et tapez: ESC :%!xxd pour passer en mode hexadécimal.

Vous pourrez modifier la partie hexadécimale (la partie texte ne sera pas mise à jour lorsque vous modifiez la partie hexadécimale).

Lorsque vous avez terminé, appuyez à nouveau sur escape et tapez: ESC :%!xxd -r pour réécrire les modifications que vous avez apportées en mode hexadécimal (n'oubliez pas de les enregistrer par la suite).

2
Ouki

Il y a beaucoup d'informations dans le manuel en ligne pour chaque commande; il vaut toujours la peine d'y jeter un œil avant d'abandonner et de poser une question.

man echo explique quelles séquences d'échappement sont autorisées. Voici un extrait.

   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

Donc\x86 est juste incorrect. il doit être octal et mettre votre chaîne entre guillemets, sinon il sera interprété par le Shell.

Exemple:

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

Modifier 1

Comme Ouki me l'a rappelé, echo est également un shell intégré, donc les informations sont dans la page de manuel de bash, man bash; voici la section pertinente. Mais tilisez des guillemets" autour de votre chaîne pour empêcher le shell d'interpréter les barres obliques inverses.

   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)
2
X Tian