จะ pad ไฟล์ด้วย“ FF” โดยใช้ dd ได้อย่างไร?


20

จะ pad ไฟล์ด้วยการ0xFFใช้งานได้ddอย่างไร?

คำสั่งนี้จะ pad ไฟล์เอาต์พุตด้วย zeroes จนกว่าขนาดไฟล์จะถึง 100 KB:

dd if=inputFile.bin ibs=1k count=100 of=paddedFile.bin conv=sync

อย่างไรก็ตามฉันต้องการ pad ไฟล์ด้วย0xFFs แทน0x00s

คำตอบ:


29

เท่าที่ผมรู้ว่ามีวิธีที่จะบอกไม่มีแผ่นโดยใช้dd 0xFFแต่มีวิธีแก้ปัญหาคือ

ขั้นแรกให้สร้างไฟล์ที่มีความยาวที่ต้องการซึ่งเต็มไปด้วย0xFF:

$ dd if=/dev/zero ibs=1k count=100 | tr "\000" "\377" >paddedFile.bin
100+0 records in
200+0 records out
102400 bytes (102 kB) copied, 0,0114595 s, 8,9 MB/s

tr0xFFจะใช้ในการแทนที่ด้วยเลขศูนย์ trคาดว่าข้อโต้แย้งในฐานแปด ในฐานแปดมี0xFF\377

ผล:

$ hexdump -C paddedFile.bin 
00000000  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|
*
00019000

จากนั้นใส่ไฟล์อินพุตที่จุดเริ่มต้นของไฟล์ "padded":

$ dd if=inputFile.bin of=paddedFile.bin conv=notrunc
0+1 records in
0+1 records out
8 bytes (8 B) copied, 7,4311e-05 s, 108 kB/s

สังเกตสิ่งconv=notruncที่บอกว่าddจะไม่ตัดทอนไฟล์เอาต์พุต

ไฟล์อินพุตตัวอย่าง:

$ hexdump -C inputFile.bin 
00000000  66 6f 6f 0a 62 61 72 0a                           |foo.bar.|
00000008

ผล:

$ hexdump -C paddedFile.bin 
00000000  66 6f 6f 0a 62 61 72 0a  ff ff ff ff ff ff ff ff  |foo.bar.........|
00000010  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|
*
00019000

2
ขั้นตอนที่ 1 การทำงานบน Linux แต่ใน OSX ไฟล์เต็มไปด้วยpaddedFile.bin c3 bfฉันสงสัยว่าทำไม? แก้ไข: superuser.com/questions/1349494/…
Synesso

1

การปรับปรุงที่เป็นไปได้ในคำตอบของ Lesmana คือการใช้งานไฟล์ในที่ นี่อาจเร็วกว่ามากสำหรับไฟล์อินพุตขนาดใหญ่และจะทำให้ไฟล์กระจัดกระจาย อย่างไรก็ตามในหลาย ๆ สถานการณ์คุณไม่ต้องการแก้ไขไฟล์อินพุตดังนั้นวิธีนี้จะไม่เหมาะสม

ตัวอย่างต่อไปนี้เริ่มต้นด้วยไฟล์อินพุตขนาดใหญ่กระจัดกระจายและวางได้สูงสุด 1GB ด้วย FF chars เพียงเปลี่ยนnewsizeค่าที่คุณต้องการ อย่างที่คุณเห็นddส่วนนั้นใช้เวลาเพียงเสี้ยววินาทีแม้ไฟล์นี้จะใหญ่มาก

$ ls -ld inputFile.bin
-rw-rw-r-- 1   …   1073741700   …   inputFile.bin
$ hexdump inputFile.bin
0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
3fffff80 0000 0000
3fffff84

$ newsize=$((1024 * 1024 * 1024))
$ filesize=$(stat -c "%s" inputFile.bin)
$ padcount=$((newsize - filesize))
$ dd if=/dev/zero ibs=1 count="$padcount" | tr "\000" "\377" >> inputFile.bin
124+0 records in
0+1 records out
124 bytes (124 B) copied, 0.000162309 s, 764 kB/s

$ ls -ld inputFile.bin
-rw-rw-r-- 1   …   1073741824   …   inputFile.bin
$ hexdump inputFile.bin
0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
3fffff80 0000 0000 ffff ffff ffff ffff ffff ffff
3fffff90 ffff ffff ffff ffff ffff ffff ffff ffff
*
40000000
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.