วิธีที่ง่ายที่สุดคือใช้binaryตัวเลือก จาก:help binary:
This option should be set before editing a binary file. You can also
use the -b Vim argument. When this option is switched on a few
options will be changed (also when it already was on):
'textwidth' will be set to 0
'wrapmargin' will be set to 0
'modeline' will be off
'expandtab' will be off
Also, 'fileformat' and 'fileformats' options will not be used, the
file is read and written like 'fileformat' was "unix" (a single <NL>
separates lines).
The 'fileencoding' and 'fileencodings' options will not be used, the
file is read without conversion.
[..]
When writing a file the <EOL> for the last line is only written if
there was one in the original file (normally Vim appends an <EOL> to
the last line if there is none; this would make the file longer). See
the 'endofline' option.
หากคุณไม่ทำเช่นนี้และสภาพแวดล้อมของคุณใช้การเข้ารหัสแบบหลายไบต์ (เช่น UTF-8 ตามที่คนส่วนใหญ่ใช้) Vim พยายามเข้ารหัสข้อความดังกล่าวซึ่งมักจะนำไปสู่ความเสียหายของไฟล์
:wคุณสามารถตรวจสอบโดยการเปิดไฟล์และเพียงแค่ใช้ ตอนนี้มันเปลี่ยนไปแล้ว
หากคุณตั้งค่าLANGและLC_ALLเป็นC(ASCII), Vim จะไม่แปลงอะไรเลยและไฟล์จะยังคงเหมือนเดิม (แต่ก็ยังเพิ่มบรรทัดใหม่) เนื่องจาก Vim ไม่จำเป็นต้องทำการเข้ารหัสแบบหลายไบต์
ผมเองยังชอบที่จะปิดการใช้งาน set wrapสำหรับไบนารีแม้ว่าคนอื่นอาจจะชอบที่จะเปิดใช้งานมัน YMMV :set display=uhexอีกสิ่งที่มีประโยชน์ที่จะทำคือ จาก:help 'display':
uhex Show unprintable characters hexadecimal as <xx>
instead of using ^C and ~C.
และเป็นเคล็ดลับสุดท้ายคุณสามารถแสดงค่าฐานสิบหกของตัวละครภายใต้เคอร์เซอร์ในไม้บรรทัดด้วย%B( :set rulerformat=0x%B)
ขั้นสูงเพิ่มเติม: xxd
คุณสามารถใช้xxd(1)เครื่องมือในการแปลงไฟล์ให้เป็นรูปแบบที่อ่านได้ง่ายขึ้นและ (นี่เป็นบิตที่สำคัญ) แยกวิเคราะห์ "รูปแบบที่อ่านได้" ที่แก้ไขแล้วและเขียนกลับเป็นข้อมูลไบนารี xxdเป็นส่วนหนึ่งของvimดังนั้นหากคุณได้ติดตั้งแล้วคุณควรจะมีvimxxd
วิธีใช้:
$ xxd /bin/ls | vi -
หรือถ้าคุณเปิดไฟล์ไว้แล้วคุณสามารถใช้:
:%!xxd
ตอนนี้ทำการเปลี่ยนแปลงของคุณคุณต้องทำเช่นนั้นที่ด้านซ้ายของจอแสดงผล (หมายเลขฐานสิบหก) การเปลี่ยนแปลงทางด้านขวา (การแสดงที่พิมพ์ได้) จะถูกละเว้นเมื่อเขียน
หากต้องการบันทึกให้ใช้xxd -r:
:%!xxd -r > new-ls
new-lsนี้จะบันทึกแฟ้มไปยัง
หรือโหลดไบนารีในบัฟเฟอร์ปัจจุบัน:
:%!xxd -r
จากxxd(1):
-r | -revert
reverse operation: convert (or patch) hexdump into binary. If
not writing to stdout, xxd writes into its output file without
truncating it. Use the combination -r -p to read plain hexadeci‐
mal dumps without line number information and without a particu‐
lar column layout. Additional Whitespace and line-breaks are
allowed anywhere.
จากนั้นใช้:wเพื่อเขียน ( ระวัง : คุณต้องการตั้งค่าbinary
ตัวเลือกก่อนที่คุณจะเขียนลงไฟล์ด้วยเหตุผลเดียวกันกับที่ร่างไว้ด้านบน)
ปุ่มลัดเสริมเพื่อทำให้ง่ายขึ้นเล็กน้อย:
" Hex read
nmap <Leader>hr :%!xxd<CR> :set filetype=xxd<CR>
" Hex write
nmap <Leader>hw :%!xxd -r<CR> :set binary<CR> :set filetype=<CR>
นอกจากนี้ยังมีให้จากเมนูหากคุณใช้ gVim ภายใต้ 'เครื่องมือ➙แปลงเป็น HEX' และ 'เครื่องมือ➙แปลงกลับ'
เคล็ดลับที่เป็นกลุ่มวิกิพีเดียมีหน้าเว็บที่มีข้อมูลเพิ่มเติมและบางสคริปต์ผู้ช่วย โดยส่วนตัวแล้วฉันคิดว่าคุณน่าจะใช้โปรแกรมแก้ไข hex จริงถ้าคุณแก้ไขไฟล์ไบนารีที่มักจะ เป็นกลุ่มสามารถ
เรียงลำดับของงาน แต่เห็นได้ชัดว่ามันไม่ได้ออกแบบมาสำหรับมันและถ้าคุณเคยเขียนโดยไม่ต้องเป็น:set binaryกลุ่มอาจทำลายไฟล์ไบนารีของคุณ!