Echo-Bytes zu einer Datei

46

Ich versuche, meinen Rasberry Pi über den i2c-Bus mit einem Display zu verbinden. Zu Beginn wollte ich manuell Dinge schreiben, insbesondere Bytes in eine Datei. Wie schreibt man bestimmte Bytes in eine Datei? Ich habe das schon gelesen und dachte, mein Problem sollte durch so etwas gelöst werden

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

Wenn ich diese Datei jedoch mit nano öffne, sehe ich anstelle von foo :

x66x6fx6f

So wurden die Backslashes ausgeblendet, aber nicht die Bytes selbst. Diesmal habe ich es auch nur ohne -e versucht , also hätte ich erwartet, dass \ x66 \ x6f \ x6f angezeigt wird , aber das Gleiche wie zuvor.

Das Echo entgeht also Backslashes, Backslashes allein und Backslashes, unabhängig davon, ob dies der Fall ist oder nicht.
Irgendeine Idee, wie man das behebt?
Laut der Manpage hätte das tun sollen, wonach ich suche.

Kennzeichen
quelle

Antworten:

65

Sie müssen Ihre Codes in Anführungszeichen setzen:

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

verursachen sonst Shell ersetzt \xzu , xbevor es geht an echo -e.

ps. Double Escape funktioniert auch:

echo -n -e \\x66\\x6f\\x6f > byteFileForNow
eilen
quelle
Ich habe es mit Anführungszeichen arbeiten lassen, obwohl doppelte Anführungszeichen. Ich war ein bisschen neu, es war etwas Offensichtliches. Vielen Dank!
Mark
Seien Sie einfach vorsichtig, da Echo (normalerweise) ein integrierter Shell-Befehl ist. bashGriff \xHHrichtig, aber nicht alle Schalen tun.
Ouki
5

Schale

In der Shell können Sie verwenden printf:

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

Hinweis: %b- Drucken Sie das zugehörige Argument aus, während Sie Backslash-Escapes interpretieren.

Perl

Mit Perl ist es noch einfacher:

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

Python

Wenn Sie Python installiert haben, versuchen Sie Folgendes:

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


Testen:

$ hexdump file.bin 
0000000 66 6f 6f 
Kenorb
quelle
1
Oder einfach perl -e 'print pack "c*", 0x66, 0x6f, 0x6f'oderperl -e 'print pack "H*", "666f6f"'
Stéphane Chazelas
2
Beachten Sie, dass printf %b '\x66'nicht tragbar ist. printf '\x66'ist etwas portabler (funktioniert mit ksh93, immer noch nicht mit dashnoch yash). printf '\146\157\157'oder printf %b '\0146\0157\0157'wäre portabel / standard.
Stéphane Chazelas
2

Dies könnte nicht direkt die Frage beantworten, aber Sie können auch viim Hex-Modus verwenden:

Öffnen Sie Ihre Datei und geben Sie Folgendes ein: ESC :%!xxd , um in den Hex-Modus zu wechseln.

Sie können den Hex-Teil bearbeiten (der Textteil wird nicht aktualisiert, wenn Sie den Hex-Teil ändern).

Wenn Sie fertig sind, drücken Sie erneut die Escape-Taste und geben Sie Folgendes ein: ESC :%!xxd -r , um die Änderungen, die Sie im Hex-Modus vorgenommen haben, zurückzuschreiben (vergessen Sie nicht, sie anschließend zu speichern).

Ouki
quelle
2

Das Online-Handbuch enthält viele Informationen zu jedem Befehl. Es lohnt sich immer, einen Blick darauf zu werfen, bevor Sie aufgeben und eine Frage stellen.

man echoerklärt welche Escape-Sequenzen erlaubt sind. Hier ist ein Auszug.

   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

Also ist \ x86 einfach falsch. Es muss oktal sein und Ihre Zeichenfolge in doppelte Anführungszeichen setzen, sonst wird es von der Shell interpretiert.

Beispiel:

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

Bearbeiten 1

Wie Ouki mich erinnerte, ist Echo auch eine eingebaute Shell, daher finden Sie die Informationen in der Handbuchseite für Bash man bash. Hier ist der relevante Abschnitt. Aber verwenden Sie Anführungszeichen " um die Zeichenfolge um die Schale zu stoppen , um die umgekehrten Schrägstrichen zu interpretieren.

   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
quelle
1
Das Ding ist echonormalerweise ein eingebauter Befehl. Das hängt also von der Shell ab, die Sie verwenden. Die Linux-Standardeinstellung ist bash; \xHHzeigt ein Zeichen korrekt durch seinen Hexadezimalwert an.
Ouki
1
Sie sind absolut richtig, mein schlechtes. Siehe mein Edit 1-Update.
X Tian