120 votes

Convertir le décimal en hexadécimal dans le shell UNIX script.

Dans un shell UNIX script, que puis-je utiliser pour convertir des nombres décimaux en hexadécimaux ? Je pensais que od ferait l'affaire, mais il ne réalise pas que je lui fournis des représentations ASCII des nombres.

printf ? C'est dégueulasse ! Je l'utilise pour l'instant, mais qu'y a-t-il d'autre ?

9 votes

Je dois demander, qu'est-ce qui est grossier avec printf ? De nombreux langages de programmation courants prennent en charge le formatage de type printf, de sorte que les solutions printf ci-dessous sont certainement les plus faciles à comprendre pour les développeurs.

5 votes

Bon sang, je ne sais pas - c'était il y a cinq ans ! Je pense que j'ai peut-être pensé que ce n'était pas une vraie coquille ou quelque chose comme ça.

205voto

Keltia Points 8104

Essayé printf(1) ?

printf "%x\n" 34
22

Il y a probablement des moyens de faire cela avec des fonctions intégrées dans tous les shells mais ce serait moins portable. Je n'ai pas vérifié les spécifications POSIX sh pour voir si elles ont de telles capacités.

1 votes

Super, j'avais besoin de convertir une adresse IPv4 en IPv6, ça marche !

6 votes

Il n'y a pas beaucoup plus POSIX que printf. Cela fonctionne même en "sh".

5 votes

Printf n'est pas d'une grande précision. bc est. par exemple, prendre 238862874857408875879219909679752457540 en entrée, printf nous donne "Resultat trop grand". la méthode BC fonctionne très bien pour les choses plus grandes qu'un int/long/bigint standard

117voto

Bill Karwin Points 204877
echo "obase=16; 34" | bc

Si vous voulez filtrer un fichier entier d'entiers, un par ligne :

( echo "obase=16" ; cat file_of_integers ) | bc

1 votes

J'ai regardé à la fois bc(1) et dc(1) et j'ai manqué celui-là.

0 votes

Y a-t-il un moyen de le transformer en un filtre qui prendrait un nombre arbitraire d'entiers, tous sur une seule ligne ?

3 votes

@skiphoppy : Si vous écrivez : echo "obase=16 ; 12 34 56" | bc vous obtenez 1E240, exactement comme si vous écriviez : echo "obase=16 ; 123456" | bc. Donc la façon de traiter un nombre arbitraire d'entiers sur une seule ligne est de mettre chaque nombre sur sa propre ligne : tr ' ' ' \015 ' <input | bc (transforme les blancs en nouvelles lignes).

73voto

pjhobbs Points 73

De l'hexadécimal au décimal :

$ echo $((0xfee10000))
4276158464

De décimal à hexadécimal :

$ printf '%x\n' 26
1a

18voto

Orwellophile Points 2695
bash-4.2$ printf '%x\n' 4294967295
ffffffff

bash-4.2$ printf -v hex '%x' 4294967295
bash-4.2$ echo $hex
ffffffff

2 votes

-v VAR est une extension bash. Non mentionné dans la page de manuel , révélé seulement si on appelle printf sans arguments

2 votes

7voto

pjhobbs Points 73

Désolé, c'est ma faute, essayez ceci...

#!/bin/bash
:

declare -r HEX_DIGITS="0123456789ABCDEF"

dec_value=$1
hex_value=""

until [ $dec_value == 0 ]; do

    rem_value=$((dec_value % 16))
    dec_value=$((dec_value / 16))

    hex_digit=${HEX_DIGITS:$rem_value:1}

    hex_value="${hex_digit}${hex_value}"

done

echo -e "${hex_value}"

Ejemplo:

$ ./dtoh 1024
400

2 votes

Merci, cela a beaucoup aidé pour env. où printf y hex ne sont pas disponibles.

4 votes

@benchuk où est printf non disponible ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X