Difficulté de conversion de binary en hexadécimal en utilisant bc

J'ai lu comment calculer en utilisant la calculasortingce de command line et un document ICI, mais néanless je ne comprends pas ce que j'attendais et ne peut pas find mon erreur, ce que j'ai fait dans le shell était:

bc << HERE >ibase=2 >obase=16 >1001 >HERE 100 

Je m'attendais à get 9 comme résultat puisque le binary 1001 est hexadécimal 9, mais j'ai 100.

Comme vous définissez ibase=2 premier, vous devez utiliser obase=10000 :

 $ echo 'ibase=2; obase=10000; 1001' | bc 9 

Comme vous définissez d'abord la base d'input, le 16 sera interprété en fonction de la base d'input (2) lorsque vous définirez la base de sortie. Il semble que le 6 dans 16 est simplement interprété est un binary 1 bit dans ce cas, et donc la base de sortie est mis à binary 11 ou décimal 3.

Pour contourner cela, vous pouvez définir la base de sortie avant de définir la base d'input:

 echo 'obase=16; ibase=2; 1001' | bc 

Bien que vous puissiez toujours prendre en count les déclarations pour [io]base= fonction de la database en cours, vous pouvez également utiliser la notation hexadécimale explicite, qui devrait fonctionner indépendamment de la base d'input. Comme ça:

 printf %s\\n ibase=2 obase=F 1001 | bc 

… qui imprime …

 9 

Vous pourriez find cela particulièrement utile si vous vous perdez lors de la configuration des bases d'input, car vous pouvez toujours revenir à une base simple 10 aussi facilement que:

 ibase=A 

C'est une syntaxe standardisée telle que mandatée par POSIX :

  • Lorsque l'une ou l'autre ibase ou obase reçoit une valeur à un chiffre de la list des conventions lexicales de bc , la valeur doit être prise en hexadécimal. (Par exemple, ibase=A définit la base dix, quelle que soit la valeur ibase actuelle.) Sinon, le comportement est indéfini lorsque des numbers supérieurs ou égaux à la valeur d' ibase apparaissent dans l'input. L' ibase et l' obase doivent avoir des valeurs initiales de 10.

C'est une convention historique qui a commencé avec dc (pour laquelle, sur certains systèmes, bc est encore un peu plus qu'un front-end) et donc …

 echo 2i Fo 1001p|dc 

… imprime également …

 9 

http://www.basicallytech.com/blog/archive/23/command-line-calculations-using-bc/

NOTE: Vous devriez mettre en premier obase , puis ibase .

Donc, vous devez utiliser l'hexagone d'abord pour "sortir" du mode binary.

 me@pc:~$ bc << HERE > obase=16 > ibase=2 > 1001 > HERE 9 me@pc:~$ bc << HERE > obase=16 > ibase=2 > 1001 > 111 > 1111 > 11111111 > HERE 9 7 F FF