remplacement binaire des BSE

j'ai essayé de faire un remplacement sed dans un fichier binaire mais je commence à croire que ce n'est pas possible. Essentiellement, ce que je voulais faire était semblable à ce qui suit:

sed -bi "s/(xFFxD8[[:xdigit:]]{1,}xFFxD9)//" file.jpg

la logique que je souhaite réaliser est: Scanner à travers un fichier binaire jusqu'au code hexadécimal FFD8 , continuer à lire jusqu'à FFD9 , et enregistrer seulement ce qui était entre eux (jette la camelote avant et après, mais inclure FFD8 et FFD9 comme le sauvegardé une partie du fichier)

y a-t-il un bon moyen de le faire? Même si vous n'utilisez pas sed ?

EDIT: je n'étais tout simplement jouer autour et a trouvé la façon la plus propre à faire de l'OMI. Je suis conscient que cette déclaration de M. grep sera cupide.

hexdump -ve '1/1 "%.2x"' dirty.jpg | grep -o "ffd8.*ffd9" | xxd -r -p > clean.jpg
10
demandé sur Ryan 2010-04-09 07:38:23

4 réponses

bbe est un "sed pour les fichiers binaires", et devraient travailler de manière plus efficace pour les gros fichiers binaires que hexdumping/reconstruction.

exemple d'utilisation:

$ bbe -e 's/original/replaced/' infile > outfile

pour plus d'informations, consultez la man page .

7
répondu Ivan Tarasov 2018-01-31 13:25:53

Is there a good way to do this

Oui bien sûr, utilisez un outil d'édition d'image comme ceux D'ImageMagick (recherche sur le net pour Linux jpeg , Exif editor etc) qui sait comment éditer les métadonnées jpg. Je suis sûr que vous trouverez un outil qui vous conviendra. Ne pas essayer de le faire à la dure. :)

3
répondu ghostdog74 2010-04-09 04:05:04

sed pourrait être en mesure de le faire, mais il pourrait être difficile. Voici un script Python qui fait la même chose (notez qu'il édite le fichier en place, ce qui est ce que je suppose que vous voulez faire basé sur votre script sed):

import re

f = open('file.jpeg', 'rb+')
data = f.read()
match = re.search('(\xff\xd8[0-9A-fa-f]+)\xff\xd9', data)
if match:
    result = match.group(1)
    f.seek(0)
    f.write(result)
    f.truncate()
else:
    print 'No match'
f.close()
1
répondu Adam Rosenfield 2010-04-09 03:58:40

aussi, ce Perl pourrait fonctionner (pas testé, caveat emptor )... si Python n'est pas installé:)

open(FILE, "file.jpg") || die "no open $!\n";
while (read(FILE, $buff, 8 * 2**10)) {
    $content .= $buff;
}
@matches = ($content =~ /(\xFF\xD8[:xdigit:]+?\xFF\xD9)/g;
print STDOUT join("", @matches);

vous devez ajouter binmode(FILE); binmode(STDOUT); sur DOS ou VMS après l'appel open() - pas nécessaire sur Unix.

1
répondu DVK 2010-04-09 04:07:50