BASH hexa en decimal signé

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

printf

http://wiki.bash-hackers.org/commands/builtin/printf
Un début de piste !

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 :stuck_out_tongue:
Pour ce qui est de l’usage avec printf, je te laisse mariner :wink:

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” :wink:

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. :wink:.

Oui, c’est le package ‘ascii2binary’ …

Au moins, je n’aurais pas perdu de temps, pour ma propre culture. :violin: