bash: écrire représentation binaire de l'entier de fichier
J'ai un fichier avec des données binaires et j'ai besoin de remplacer quelques octets dans une certaine position. Je suis venu avec la suite directe de bash à l'offset et de me montrer qu'il a trouvé l'endroit que je veux:
dd bs=1 if=file iseek=24 conv=block cbs=2 | hexdump
Maintenant, utiliser "fichier" en tant que sortie:
echo anInteger | dd bs=1 of=hextest.txt oseek=24 conv=block cbs=2
Cela semble fonctionner très bien, je peux passer en revue les modifications apportées à un éditeur hexadécimal. Problème est, "anInteger" sera écrit que la représentation ASCII de l'entier (ce qui est logique) mais j'ai besoin d'écrire la représentation binaire.
Je veux utiliser bash pour cela et le script doit s'exécuter sur autant d'ordinateurs que possible (je ne sais pas si le système cible aura python ou que ce soit installé).
Comment dois-je dire à la commande pour convertir l'entrée binaire (éventuellement à partir d'un hex)?
Pas sûr de ce que tu veux dire par "xdelta". Il n'y a pas de commande sur ma coquille...
xxd -r
est conçu à cet effetOui. Voir stackoverflow.com/a/8199163/219324.
OriginalL'auteur Max Leske | 2010-04-30
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser de l'écho à émettre spécifiques des octets à l'aide hexadécimal ou octal. Par exemple:
sera d'impression ascii 0 (0x30)
(-n retirer de fuite saut de ligne)
echo est inversement proportionnelle à la non-compatibles-pour l'exemple ci-dessus, certaines implémentations, il suffit d'imprimer
-e \x30
, ce qui n'est pas ce que vous voulez.Bizarre, n'aurait pas pensé. Heureusement, le script est déjà en cours d'exécution sans problèmes.
pourquoi, oh pourquoi, n'est-ce pas là une façon simple de le faire avec des nombres décimaux? Je suis à la conversion à l'hex de première
echo -ne \\x$(printf '%x' 65)
sûrement, il y a une meilleure façon...?Je suggère l'utilisation de
printf
au lieu deecho -n -e
:printf \\x30
OriginalL'auteur cs80
printf
est plus portable queecho
. Cette fonction prend un nombre entier décimal et les sorties d'un octet avec la valeur:Si vous connaissez le nombre entier(s) à l'avance, vous pouvez simplifier un peu les choses, par exemple
printf "\x30"
C'est vrai, voir la OP réponse de. Cependant, le but de cette fonction est la polyvalence.
OriginalL'auteur Dennis Williamson
xxd
est la meilleure façon de faire.xxd -r infile outfile
prendra ascii hex-valeur en infile de patch outfile, et vous pouvez spécifier la position spécifique dans infile:1FE:55AA
OriginalL'auteur juzejian
Travaillé comme un régal. J'ai utilisé le code suivant pour remplacer 4 octets octet 24 en little endian avec deux entiers (1032 et 1920). Le code de ne pas tronquer le fichier.
Merci encore.
OriginalL'auteur Max Leske
Si vous êtes prêt à appuyer sur la colombie-britannique (ce qui est assez fréquent)
pourrait aider.
OriginalL'auteur nc3b
Vous pourriez mettre l'entrée souhaitée dans un fichier et utiliser le "si=" option de dd pour insérer exactement l'entrée que vous désirez.
OriginalL'auteur WhirlWind
J'ai une fonction pour ce faire:
Vous pouvez utiliser de la tuyauterie ou de redirection pour récupérer le résultat.
OriginalL'auteur Adam
Avec bash, "printf" a "-v" option, et tout de la coquille a l'aide d'opérateurs logiques.
Donc, ici, est plus simple formulaire en bash :
OriginalL'auteur Vouze
Dans mon cas, j'avais besoin d'aller d'un point décimal argument de la réelle non signé de 16 bits big endian valeur. Ce n'est probablement pas le moyen le plus efficace, mais il fonctionne:
OriginalL'auteur Ray Foulk