відлуння байтів у файл


46

Я намагаюся підключити свій rasberry Pi до якогось дисплея за допомогою шини i2c. Для початку я хотів вручну написати речі, зокрема байти у файл. Як ви пишете конкретні байти у файл? Я вже читав це і вважав, що мою проблему слід вирішити приблизно так

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

Однак, коли я відкриваю цей файл з nano, замість foo, я бачу:

x66x6fx6f

Так ухилилися косої риси, але не самі байти. Я також спробував те ж саме тільки без -e на цей раз, так що я б exepected бачити \ x66 \ x6f \ x6f , але отримав такий же , як і раніше.

Таким чином, відлуння ухиляється від косого нахилу, косого нахилу та нахилу, незалежно від того, чи потрібно.
Будь-яка ідея, як це виправити?
За даними сторінки, яка повинна була робити те, що я шукав.

Відповіді:


65

Ви повинні взяти свої коди в лапки:

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

в іншому випадку оболонка замінюється \xдо того, xяк вона перейде echo -e.

пс. подвійний втечу також буде працювати:

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

Я змусив його працювати з цитатами, хоча і подвійними цитатами. Я якось новий це було щось очевидне. Дякую!
Марк

Будьте обережні, оскільки відлуння (як правило) є вбудованою командою оболонки. bashповодитися \xHHправильно, але не всі снаряди роблять.
Ouki

5

Оболонка

У оболонці ви можете використовувати 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 

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 щоб записати зміни, які ви зробили в шестигранному режимі (не забудьте зберегти згодом).


2

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

man echoпояснює, які послідовності втечі дозволені. Ось витяг.

   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, луна також є вбудованої командою оболонки, тому інформація на сторінці керівництва для Баша, 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)

1
Річ у тому echo, що зазвичай є вбудована команда. Отже, це залежить від оболонки, яку ви використовуєте. Значення за замовчуванням Linux bash; \xHHналежним чином відображення символу через його шістнадцяткове значення.
Ouki

1
Ви абсолютно правильні, моя погана. Дивіться моє оновлення 1 редагування.
X Tian
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.