วิธีเพิ่มข้อมูล 8 ไบต์ลงในไฟล์ไบนารีใน Linux ได้อย่างไร


คำตอบ:


16

นี่คือวิธีหนึ่งในการทำเช่นนั้น

printf "\x68\x65\x6c\x6c\x6f\x20\x77\x6f" | cat - oldfile > newfile

อาร์กิวเมนต์printfเป็นลำดับ 8 ไบต์ในฐานสิบหก เพียงแทนที่ค่าที่ฉันใช้ (ซึ่งเป็นอักขระ ASCII "hello wo") ด้วยของคุณ


นี่ควรเป็นคำตอบที่ยอมรับได้
Dmitry Volosnykh

ดังนั้นฉันต้องเพิ่ม 256kB เป็นไฟล์ 120GB และฉันไม่ต้องการรอ 30 นาทีเพื่อคัดลอกและเขียนทั้ง 120GB อย่างสมบูรณ์ ... ไม่มีทางเลยเหรอ?
mxmlnkn

@mxmlnkn คุณต้องมีไดรเวอร์ระบบปฏิบัติการและระบบไฟล์สำหรับการรวมประเภทนั้น อาจจะbtrfsมีเคอร์เนลที่กำหนดเอง?
jiggunjer

@mxmlnkn หากคุณหมายถึง 256 KiB ซึ่งมากกว่า 512 B ให้ดูคำตอบสำหรับคำถามนี้ คุณสามารถเชื่อมไฟล์สองไฟล์หรือมากกว่าเข้าด้วยกันเป็นอุปกรณ์พิเศษโดยไม่ต้องเขียนผลลัพธ์ลงดิสก์ใด ๆ
Kamil Maciorowski

3

มันไม่ได้เป็นคำสั่ง 'มันเป็น' พวงของคำสั่ง '(ในประเพณียูนิกซ์เก่าดี):

  • ใส่ 8 ไบต์ของคุณเป็นไฟล์
  • ผนวกไฟล์ต้นฉบับเข้ากับไฟล์นั้น
  • เปลี่ยนชื่อไฟล์ใหม่เป็นชื่อของไฟล์ต้นฉบับ

หรือ:

% echo -n "12345689" > new_file
% cat original >> new_file
% mv new_file original

หรือถ้าคุณต้องการอ่าน 8 ไบต์จากที่อื่น:

% dd if=inputstream of=new_file bs=1 count=8

จากนั้นดำเนินการต่อตามด้านบน


1

นี่ไม่ใช่คำตอบที่ถูกต้องสำหรับคำถามต้นฉบับ แต่เป็นเพียงความคิดเห็นเพื่อตอบข้อกังวลที่เหมาะสมในข้อคิดเห็นของ @mxmlnkn

ดังนั้นฉันจำเป็นต้องเพิ่ม 256kB เป็นไฟล์ 120GB และฉันไม่ต้องการรอ 30 นาทีเพื่อคัดลอกและเขียนทั้ง 120GB อย่างสมบูรณ์ ... ไม่มีทางเลยเหรอ?

ค้นหาเว็บสำหรับ 'fallocate prepend to file' ซึ่งจะแสดงคำตอบที่ใช้ StackExchange (EDIT: เช่นhttps://stackoverflow.com/a/37884191/9378469 )

วิธี fallocate ที่ให้ Linux 4.1+ (XFS) หรือ 4.2+ (XFS, ext4) ช่วยให้คุณสามารถแทรกรูขนาดของระบบไฟล์ในหน้าไฟล์หวังว่าในเวลาคงที่ สิ่งนี้อาจหรืออาจไม่ยืดหยุ่นพอสำหรับปัญหาของคุณ


2
ยินดีต้อนรับสู่ Super User! เป็นเรื่องยากที่จะตอบคำถามอายุ 7 ปี แต่ "การค้นหา<phrase> " ไม่ใช่คำตอบที่สมบูรณ์ - คุณสามารถขยายออกไปได้หรืออาจรวมตัวอย่างไว้ที่นี่ด้วย? :)
bertieb

ฉันไม่ได้ตั้งเป้าหมายว่าจะสมบูรณ์ แต่เพียงเพิ่มข้อมูลบางอย่างเพื่อป้องกันผู้อ่านไม่ให้ไปด้วยข้อสรุปที่ไม่ถูกต้อง ฉันไม่ต้องการที่จะโพสต์สิ่งนี้เป็นคำตอบ แต่ความคิดเห็นต้องการ 50 ตัวแทนซึ่งนำไปสู่สถานการณ์ที่ไม่ดีอย่างนี้ ฉันได้แก้ไข "คำตอบ" พร้อมลิงก์ไปยังคำตอบที่ครอบคลุมที่สุดที่ฉันสามารถหาได้ในขณะนี้
Foo Barian

0

ทดสอบใน cygwin ควรทำงานบน linux

ใช้ xxd และ sed

ในหนึ่งบรรทัด

$ xxd -p a.a | sed 's/^/6162636465/' | xxd -r -p > a2.a

พังทลาย

display a.a
$ cat a.a
abc



look at the hex of a.a  
user@comp ~
$ xxd -p a.a
6162630a

ไฟล์นี้มีบรรทัดใหม่ในท้ายที่สุดตามที่ xxd แสดงอยู่ด้านบน

ดูว่ามีกี่บรรทัดที่ xxd -p พิมพ์ .. จะมีเพียงหนึ่งบรรทัดเท่านั้นโดยไม่คำนึงถึงไฟล์ที่ได้รับเนื่องจากตัวละครทั้งหมดในไฟล์จะเปลี่ยนเป็นเลขฐานสิบหกและจะพิมพ์จริง \ n เมื่อสิ้นสุดสิ่งที่ทิ้งไว้ (ซึ่งคุณจะเห็นว่าคุณทำ xxd -p aa | xxd -p)

$ xxd -p a.a | wc -l
1

sed ทำงานในแต่ละบรรทัดและเมื่อป้อน xxd -p, sed จะต้องป้อนข้อมูลเพียงบรรทัดเดียวเท่านั้นจึงง่ายมาก

user@comp ~
$ xxd -p a.a | sed 's/^/6162636465/'
61626364656162630a

user@comp ~
$ xxd -p a.a | sed 's/^/6162636465/' | xxd -r -p > a2.a

user@comp ~
$ xxd -p a2.a
61626364656162630a

user@comp ~
$ cat a2.a
abcdeabc

user@comp ~
$
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.