байты эха в файл

Я пытаюсь подключить свой Rasberry Pi к некоторому дисплею, используя шину i2c. Для начала я хотел вручную написать материал, в частности байты в файл. Как вы пишете конкретные байты в файл? Я уже читал, что один и я решили, что моя проблема должна быть решена чем-то вроде этого

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

Однако, когда я открываю этот файл с помощью nano, вместо foo я вижу:

x66x6fx6f

Таким образом, обратные косые черты были экранированы, но не сами байты. Я тоже пробовал то же самое без -e на этот раз, поэтому я бы предпочел увидеть \ x66 \ x6f \ x6f , но получил то же самое, что и раньше.

Таким образом, эхо ускользает от обратных косых черт, обратных косых черт и обратной косой черты, независимо от того, предполагается ли это.
Любая идея, как это исправить?
Согласно man-странице, которая должна была сделать то, что я ищу.

Вы должны взять свои коды в кавычки:

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

иначе оболочка заменяет \x на x перед тем, как перейти к echo -e .

пс. двойной побег также будет работать:

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

Это может не отвечать на вопрос непосредственно, но вы также можете использовать vi в шестнадцатеричном режиме:

Откройте файл и введите: ESC :%!xxd чтобы перейти в шестнадцатеричный режим.

Вы сможете отредактировать шестнадцатеричную часть (текстовая часть не будет обновляться по мере изменения шестнадцатеричной части).

Когда вы закончите, снова нажмите escape и введите: ESC :%!xxd -r чтобы записать изменения, сделанные вами в шестнадцатеричном режиме (не забудьте сохранить потом).

В каждой команде есть много информации в онлайн-руководстве, всегда стоит взглянуть на это, прежде чем сдавать и публиковать вопрос.

man echo объясняет, какие escape-последовательности разрешены. Вот выдержка.

  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 

Итак, \ x86 просто некорректен. он должен быть восьмеричным и помещать строку в двойные кавычки, иначе она будет интерпретирована оболочкой.

пример

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

Редактировать 1

Как напомнил мне Оуки, эхо также является оболочкой buitin, поэтому информация находится на странице руководства для bash, man bash , вот соответствующий раздел. Но используйте «Котировки " вокруг вашей строки, чтобы остановить интерпретацию оболочки косой чертой.

  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) 

Оболочка

В оболочке вы можете использовать printf :

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

Примечание: %b – печать связанного аргумента при интерпретации обратных совпадений.

Perl

С perl это еще проще:

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

питон

Если вы установили Python, попробуйте следующий однострочный:

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


Тестирование:

 $ hexdump file.bin 0000000 66 6f 6f