echo octets dans un fichier

47

J'essaie de connecter mon rasberry Pi à certains écrans en utilisant le bus i2c. Pour commencer, je voulais écrire manuellement des éléments, notamment des octets, dans un fichier. Comment écrivez-vous des octets spécifiques dans un fichier? J'ai déjà lu celui-là et j'ai pensé que mon problème devrait être résolu par quelque chose comme ceci

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 aussi essayé la même chose seulement sans le -e cette fois, donc j'aurais attendu de voir \ x66 \ x6f \ x6f , mais j'ai obtenu le même résultat qu'auparavant.

Donc, echo échappe aux barres obliques inverses, aux barres obliques inverses seules et inverses, qu’il soit ou non supposé l’être.
Une idée comment résoudre ce problème?
Selon la page de manuel qui aurait dû faire ce que je cherche.

marque
la source

Réponses:

66

Vous devez prendre vos codes entre guillemets:

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

faire autrement shell remplace \xà xavant qu'il aille echo -e.

ps. la double évacuation fonctionnera également:

echo -n -e \\x66\\x6f\\x6f > byteFileForNow
se ruer
la source
Je l’ai obtenu avec des guillemets, bien que des guillemets doubles. J'ai un peu nouveau c'était quelque chose d'évident. Merci!
Mark
Soyez prudent, car echo est (généralement) une commande shell intégrée. bashmanipuler \xHHcorrectement, mais tous les obus ne le font pas.
Ouki
6

coquille

En shell, vous pouvez utiliser printf:

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

Remarque: %b- Imprimez l'argument associé lors de l'interprétation des caractères d'échappement des barres obliques inverses.

Perl

Avec perl, c'est encore plus simple:

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

Python

Si vous avez installé Python, essayez l'un des doublons suivants:

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 
Kenorb
la source
1
Ou juste perl -e 'print pack "c*", 0x66, 0x6f, 0x6f'ouperl -e 'print pack "H*", "666f6f"'
Stéphane Chazelas
2
Notez que ce printf %b '\x66'n'est pas portable. printf '\x66'est légèrement plus portable (fonctionne avec ksh93, toujours pas avec dashni yash). printf '\146\157\157'ou printf %b '\0146\0157\0157'serait portable / standard.
Stéphane Chazelas
2

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

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

Vous pourrez éditer la partie hexadécimale (la partie texte ne sera pas mise à jour lorsque vous modifierez la partie hexagonale).

Lorsque vous avez terminé, appuyez de nouveau sur échapper et tapez: ESC :%!xxd -r pour écrire les modifications que vous avez apportées en mode hexadécimal (n'oubliez pas de sauvegarder après).

Ouki
la source
2

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

man echoexplique 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 elle sera interprétée par le shell.

Exemple:

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

Modifier 1

Comme Ouki m'a rappelé, l' écho est également une commande du shell, de sorte que l'information est dans la page de manuel pour bash, man bash; voici la section pertinente. Mais utilisez des guillemets " autour de votre chaîne pour empêcher le shell d'interpréter les barres obliques inversées.

   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
la source
1
Le problème est echogénéralement une commande intégrée. Donc, cela dépend du shell que vous utilisez. La valeur par défaut de Linux étant bash; \xHHaffiche correctement un caractère via sa valeur hexadécimale.
Ouki
1
Vous avez absolument raison, mon mauvais. Voir ma mise à jour 1 éditer.
X Tian