bonsoir
je cherche a convertir un hex en decimal signé
$mavariable=0xFA31
j’ai essayer hexdump, let et le resultat est : 64049 valeur non-signée au-lieu de -1487 valeur signée
une idée de commande
merci
bonsoir
je cherche a convertir un hex en decimal signé
$mavariable=0xFA31
j’ai essayer hexdump, let et le resultat est : 64049 valeur non-signée au-lieu de -1487 valeur signée
une idée de commande
merci
un oubli de ma part
j’ai deja fait un printf %d ou %i avec et sans +
toujours un resultat non-signé
Je te propose cette solution :
:~$ echo "obase=10;ibase=16; (FA31-1)-FFFF" | bc
# fonctionne aussi dans sa forme abrégée :
:~$ echo "ibase=16; (FA31-1)-FFFF" | bc
J’explique :
Ton problème m’intéressant - moi qui suis ignare en beaucoup de choses, et n’aies pas une grande culture, surtout mathématique informatique - après quelques recherches, je suis tombé sur ce site : http://sandbox.mc.edu/~bennet/cs110/tc/tctod.html
Ce qui a attiré mon attention est cette explication :
Je traduis ce que je me suis permis de mettre en gras :
Avec, mon esprit logique et mes réminiscences du binaire, je me suis dit, si c’est bon pour le binaire, ça doit forcément fonctionner en Hexa - comprenant que la valeur inverse de ton chiffre hexa s’obtient grâce à ‘- FFFF’ …
le reste était de comprendre comment l’écrire en Bash.
J’ai testé avec d’autres valeurs, et comparé avec ce convertisseur PHP - le résultat est juste !
Bien sûr, je peux avoir compris de travers
Pour ce qui est de l’usage avec printf, je te laisse mariner
La formule la plus juste apparaît être :
echo "obase=10;ibase=16; -((FFFF - FA31) +1)" | bc
Ce cours sur la numérotation me paraît bien… et particulièrement la “représentation des nombres négatifs”
Je ne pense pas avoir compris assurément tout le propos… mais je retiens particulièrement cette notion de complément vrai - qui me parait importante.
Pour finir, un petit script bash, utilisant la notion de complement a 2 en hexa, utilisant printf :
#!/bin/bash
##
# call as: ./hexa2negativedec <hexa> # (WITHOUT '0x')
##
# print to upper-case to writing correctly hexa
arg=$(printf "%X" "0x$1")
for i in $(seq 0 $((${#arg} - 1))); do
calc[$i]=$(echo "ibase=16;obase=10; F - ${arg:$i:1}" | bc)
done
# interpret as string
hexa=$(printf "%s" ${calc[@]})
# two complements hexa
cplv2=$(echo "ibase=16;obase=10; ${hexa} +1" |bc)
# print signed dec from twos complement hexa
res=$(printf "%d\n" "-0x${cplv2}")
echo $res
# possible to resume as:
cplv2b=$(printf "%d\n" "-0x$(echo "ibase=16;obase=10; $(printf "%s" ${calc[@]}) +1" |bc)")
echo $cplv2b
merci à tous
j’ai trouver “ascii2bunary”
A mon avis c’est binary pas bunary. .
Oui, c’est le package ‘ascii2binary’ …
Au moins, je n’aurais pas perdu de temps, pour ma propre culture.