Comment compiler un fichier avec “FF” en utilisant dd?

20

Comment compiler un fichier avec 0xFFusing dd?

Cette commande remplit le fichier de sortie avec des zéros jusqu'à ce que la taille du fichier atteigne 100 Ko:

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

Cependant, je veux remplir un fichier avec 0xFFs au lieu de 0x00s.

XP1
la source

Réponses:

29

Pour autant que je sache, il n'y a aucun moyen de dire ddà l'aide de pad 0xFF. Mais il existe une solution de contournement.

Commencez par créer un fichier de la longueur requise, renseigné avec 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

trest utilisé pour remplacer les zéros avec 0xFF. trattend des arguments en octal. 0xFFen octal est \377.

Résultat:

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

Ensuite, insérez le fichier d'entrée au début du fichier "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

Notez le conv=notruncqui dit ddde ne pas tronquer le fichier de sortie.

Exemple de fichier d'entrée:

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

Résultat:

$ 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
lesmana
la source
2
L'étape 1 fonctionne sous Linux, mais le fichier paddedFile.binest rempli avec osx c3 bf. Je me demande pourquoi? edit: superuser.com/questions/1349494/…
Synesso
1

Une amélioration possible de la réponse de lesmana consiste à opérer le fichier en place. Cela pourrait être beaucoup plus rapide pour les fichiers d'entrée volumineux et conserverait également les fichiers clairsemés. Cependant, dans de nombreuses situations, vous ne souhaitez pas modifier votre fichier d'entrée et cette méthode sera donc inappropriée.

L'exemple suivant commence par un fichier d'entrée volumineux et fragmenté et le remplit jusqu'à une taille de 1 Go avec des caractères FF. Changez simplement newsizeà votre valeur désirée. Comme vous pouvez le constater, la ddpartie ne prend qu’une fraction de seconde bien que le fichier soit très volumineux.

$ 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
asdf
la source