echo byte vào một tập tin


46

Tôi đang cố gắng kết nối Pi rasberry của tôi với một số màn hình bằng cách sử dụng bus i2c. Để bắt đầu, tôi muốn viết thủ công, cụ thể là byte vào một tệp. Làm thế nào để bạn viết byte cụ thể vào một tập tin? Tôi đã đọc nó và tôi nhận ra vấn đề của mình nên được giải quyết bằng một cái gì đó như thế này

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

Tuy nhiên, khi tôi mở tệp đó bằng nano, thay vì foo tôi thấy:

x66x6fx6f

Vì vậy, dấu gạch chéo ngược đã được thoát, nhưng không phải là byte. Tôi cũng đã thử tương tự mà không có -e lần này, vì vậy tôi đã rất vui khi thấy \ x66 \ x6f \ x6f , nhưng vẫn giống như trước.

Vì vậy, echo đang thoát khỏi dấu gạch chéo ngược, dấu gạch chéo ngược một mình và dấu gạch chéo ngược bất kể nó được cho là như thế nào.
Bất kỳ ý tưởng làm thế nào để khắc phục điều này?
Theo trang người đàn ông nên thực hiện những gì tôi đang tìm kiếm.

Câu trả lời:


65

Bạn phải lấy mã của bạn vào dấu ngoặc kép:

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

gây Thay thế khác vỏ \xđể xtrước khi nó đi vào echo -e.

ps. thoát kép cũng sẽ hoạt động:

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

Tôi đã nhận nó để làm việc với dấu ngoặc kép, dấu ngoặc kép mặc dù. Tôi hơi mới đó là một cái gì đó rõ ràng. Cảm ơn!
Đánh dấu

Chỉ cần cẩn thận vì tiếng vang là (thường) một lệnh shell dựng sẵn. bashxử lý \xHHđúng cách, nhưng không phải tất cả các vỏ làm.
Ouki

5

Vỏ

Trong shell bạn có thể sử dụng printf:

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

Lưu ý: %b- In đối số được liên kết trong khi giải thích dấu gạch chéo ngược.

Perl

Với perl, nó thậm chí còn đơn giản hơn:

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

Con trăn

Nếu bạn đã cài đặt Python, hãy thử một lớp lót sau:

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


Kiểm tra:

$ hexdump file.bin 
0000000 66 6f 6f 

1
Hoặc chỉ perl -e 'print pack "c*", 0x66, 0x6f, 0x6f'hoặcperl -e 'print pack "H*", "666f6f"'
Stéphane Chazelas

2
Lưu ý rằng printf %b '\x66'không phải là di động. printf '\x66'là di động hơn một chút (hoạt động với ksh93, vẫn không có dashcũng không yash). printf '\146\157\157'hoặc printf %b '\0146\0157\0157'sẽ là xách tay / tiêu chuẩn.
Stéphane Chazelas

2

Điều này có thể không trả lời trực tiếp câu hỏi, nhưng bạn cũng có thể sử dụng viở chế độ hex:

Mở tệp của bạn và gõ: ESC :%!xxd để chuyển sang chế độ hex.

Bạn sẽ có thể chỉnh sửa phần hex (phần văn bản sẽ không được cập nhật khi bạn thay đổi phần hex).

Khi bạn hoàn thành nhấn thoát lần nữa và gõ: ESC :%!xxd -r để ghi lại những thay đổi bạn đã thực hiện ở chế độ hex (đừng quên lưu lại sau đó).


2

Có rất nhiều thông tin trong hướng dẫn trực tuyến cho mỗi lệnh; luôn luôn đáng để xem xét điều đó trước khi từ bỏ và đăng câu hỏi.

man echogiải thích các chuỗi thoát được cho phép. Đây là một trích xuất.

   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

Vì vậy, \ x86 không chính xác. nó phải là số bát phân và đặt chuỗi của bạn trong dấu ngoặc kép, nếu không nó sẽ được giải thích bởi shell.

Thí dụ:

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

Chỉnh sửa 1

Như Ouki đã nhắc nhở tôi, tiếng vang cũng là một vỏ dựng sẵn, vì vậy thông tin nằm trong trang hướng dẫn sử dụng bash , man bash; đây là phần có liên quan. Nhưng sử dụng dấu ngoặc kép " quanh chuỗi của bạn để ngăn vỏ diễn giải các dấu gạch chéo ngược.

   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
Điều echothường là một lệnh dựng sẵn. Vì vậy, đây là tùy thuộc vào vỏ bạn đang sử dụng. Mặc định linux là bash; \xHHđang hiển thị đúng một ký tự thông qua giá trị thập lục phân của nó.
Ouki

1
Bạn hoàn toàn chính xác, xấu của tôi. Xem bản cập nhật chỉnh sửa 1 của tôi.
X Tian
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.