echo bytes เป็นไฟล์


46

ฉันกำลังพยายามเชื่อมต่อ rasberry Pi ของฉันกับจอแสดงผลบางตัวโดยใช้บัส i2c ในการเริ่มต้นฉันต้องการเขียนเนื้อหาด้วยตนเองโดยเฉพาะอย่างยิ่งไบต์กับไฟล์ คุณเขียนไบต์ที่ต้องการลงไฟล์ได้อย่างไร? ฉันได้อ่านแล้วและฉันคิดว่าปัญหาของฉันควรได้รับการแก้ไขโดยสิ่งนี้

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

อย่างไรก็ตามเมื่อฉันเปิดไฟล์ด้วยนาโนแทนที่จะเป็นฟูฉันเห็น:

x66x6fx6f

ดังนั้นแบ็กสแลชจึงหนีไปได้ แต่ไม่ใช่ไบท์เอง ฉันก็ลองแบบเดียวกันโดยไม่ใช้-eคราวนี้ฉันเลยจะได้เห็นภาพ\ x66 \ x6f \ x6fแต่กลับเหมือนเดิม

ดังนั้นเสียงก้องคือการหลีกเลี่ยงแบ็กสแลช, แบ็กสแลชคนเดียวและแบ็กสแลชโดยไม่คำนึงว่าควรจะเป็นอะไร
ความคิดวิธีการแก้ไขปัญหานี้?
ตามหน้าคนที่ควรจะทำสิ่งที่ฉันกำลังมองหา

คำตอบ:


65

คุณต้องใส่รหัสของคุณลงในเครื่องหมายคำพูด:

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

ทำให้เกิดการแทนที่เปลือกเป็นอย่างอื่น\xไปก่อนที่มันจะไปxecho -e

PS การหลบหนีสองครั้งจะทำงาน:

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

ฉันได้มันไปทำงานกับอัญประกาศ ฉันค่อนข้างใหม่มันเป็นสิ่งที่ชัดเจน ขอบคุณ!
Mark

แค่ระวังให้มากที่สุดเท่าที่ echo คือคำสั่ง builtin shell 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"'
Stéphane Chazelas

2
โปรดทราบprintf %b '\x66'ว่าไม่ได้พกพา printf '\x66'สามารถพกพาได้มากกว่านี้เล็กน้อย (ใช้งานได้ksh93แต่ไม่รองรับdashหรือไม่ใช้yash) printf '\146\157\157'หรือprintf %b '\0146\0157\0157'จะพกพา / มาตรฐาน
Stéphane Chazelas

2

สิ่งนี้อาจไม่ตอบคำถามโดยตรง แต่คุณสามารถใช้viในโหมด hex ได้:

เปิดไฟล์ของคุณและพิมพ์: ESC :%!xxdเพื่อเปลี่ยนเป็นโหมดฐานสิบหก

คุณจะสามารถแก้ไขส่วนที่หก (ส่วนข้อความจะไม่ได้รับการปรับปรุงเมื่อคุณเปลี่ยนส่วนที่เป็นเลขฐานสิบหก)

เมื่อคุณกดปุ่ม Escape อีกครั้งและพิมพ์: ESC :%!xxd -rเพื่อเขียนการเปลี่ยนแปลงที่คุณทำในโหมด hex (อย่าลืมบันทึกหลังจากนั้น)


2

มีข้อมูลจำนวนมากในคู่มือออนไลน์สำหรับแต่ละคำสั่ง มันคุ้มค่าที่จะดูว่าก่อนที่จะยอมแพ้และโพสต์คำถาม

man echoอธิบายว่าอนุญาตให้ใช้ escape sequences ใดได้บ้าง นี่คือสารสกัด

   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 เป็นเชลล์ในตัวดังนั้นข้อมูลจึงอยู่ในหน้าคู่มือสำหรับการทุบตี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มักจะเป็นคำสั่งในตัว ดังนั้นนี่ขึ้นอยู่กับเชลล์ที่คุณใช้ ที่ถูกลินุกซ์เริ่มต้นbash; \xHHแสดงอักขระอย่างถูกต้องผ่านค่าเลขฐานสิบหก
Ouki

1
คุณผิดจริงๆ ดูอัปเดตการแก้ไข 1 ของฉัน
X Tian
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.