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

47

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

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

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

x66x6fx6f

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

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

отметка
источник

Ответы:

66

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

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

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

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

echo -n -e \\x66\\x6f\\x6f > byteFileForNow
порыв
источник
Я получил его для работы с кавычками, хотя двойные кавычки. Я вроде новый, это было что-то очевидное. Благодарность!
Марка
Просто будьте осторожны, так как echo - это (обычно) встроенная команда оболочки. bashобращаться \xHHправильно, но не все оболочки делают.
Ouki
6

Ракушка

В оболочке вы можете использовать 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 
kenorb
источник
1
Или просто perl -e 'print pack "c*", 0x66, 0x6f, 0x6f'илиperl -e 'print pack "H*", "666f6f"'
Стефан Шазелас
2
Обратите внимание, что printf %b '\x66'это не портативный. printf '\x66'немного более портативный (работает ksh93, но не с dashни yash). printf '\146\157\157'или printf %b '\0146\0157\0157'будет портативным / стандартным.
Стефан Шазелас
2

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

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

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

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

Ouki
источник
2

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

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

Как напомнил мне Ouki, echo - это также встроенная оболочка, поэтому информация находится на странице руководства для 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)
X Тянь
источник
1
Дело в том echo, как правило , команда встроенной. Так что это зависит от оболочки, которую вы используете. Linux по умолчанию является bash; \xHHправильно отображает символ через его шестнадцатеричное значение.
Ouki
1
Ты абсолютно прав, мой плохой. Смотрите мое обновление 1 обновление.
X Tian