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.
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
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.
Avec Perl, c'est encore plus simple:
Perl -e 'print pack("ccc",(0x66,0x6f,0x6f))' > file.bin
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
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).
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)