# Hex in Dec in C++



## keller64283 (30. November 2008)

Ich habe folgenden Code der auch funktioniert und suche nun eine Möglichkeit auch
hex-Zahlendie größer als f sind umzurechnen:

#include <iostream>
#include <conio.h>
#include <string>
using namespace std;
int main()
{

int a;
char i;
cout << "Eingabe: ";
cin >> i;

switch(i) {
case '1' : a=1; break;
case '2' : a=2; break;
case '3' : a=3; break;
case '4' : a=4; break;
case '5' : a=5; break;
case '6' : a=6; break;
case '7' : a=7; break;
case '8' : a=8; break;
case '9' : a=9; break;
case 'a' : a=10; break;
case 'b' : a=11; break;
case 'c' : a=12; break;
case 'd' : a=13; break;
case 'e' : a=14; break;
case 'f' : a=15; break;
default : i=0;
}
if (i > f, a > 15)
{

cout<< "hex: " << i << " dec: " << a <<endl;


	}


----------



## engelmarkus (30. November 2008)

Wie wärs einfach so:


```
#include <iostream>

int main() {
     std::cout << std::hex << 15 << std::endl;
     std::cout << std::dec << 0xFF << std::endl;
     std::cin.ignore();

     return 0;
}
```


----------



## MCoder (30. November 2008)

Ich denke, keller64283 geht es eher darum, einen Eingabestring zu vearbeiten:

```
int a;
std::cin >> std::hex >> a;

std::cout << "DEC: " << a << std::endl
          << "HEX: " << std::hex << a << std::endl;
```
Gruß
MCoder


----------



## keller64283 (30. November 2008)

Danke für den Tip es geht leider nicht so ganz.
Ich poste den quelltext:
#include <iostream>
#include <conio.h>
#include <string>
using namespace std;
int main()
{
char f;	
int a;
char i();
cout << "Eingabe: ";

std::cin >> std::hex >> a;
switch(i) {
case '1' : a=1; break;
case '2' : a=2; break;
case '3' : a=3; break;
case '4' : a=4; break;
case '5' : a=5; break;
case '6' : a=6; break;
case '7' : a=7; break;
case '8' : a=8; break;
case '9' : a=9; break;
case 'a' : a=10; break;
case 'b' : a=11; break;
case 'c' : a=12; break;
case 'd' : a=13; break;
case 'e' : a=14; break;
case 'f' : a=15; break;
default : i=0;
}
if ( a > 15)
{
std::cout << "DEC: " << a << std::endl
          << "HEX: " << std::hex << a << std::endl;


	}
}
Vielleicht fällt noch jemanden etwas ein. Die Switch-case Geschichte muß bleiben. Danke.


----------



## MCoder (30. November 2008)

keller64283 hat gesagt.:


> Vielleicht fällt noch jemanden etwas ein. Die Switch-case Geschichte muß bleiben.


Na wenn du dir den Aufwand machen willst 

Dann packe die eigentliche Konvertierung (den switch-case-Block) am besten in eine eigene Funktion. Beim Einlesen (cin) nimmst du dann entweder ein char-Array oder die string-Klasse. Dann musst du in einer Schleife jedes eingelesene Zeichen mit der Konvertierungsfunktion umwandeln und entsprechend seiner Position mit 10, 100, 1000 usw. multiplizieren.

Gruß
MCoder


----------



## Muggefronc (1. Dezember 2008)

zum konvertieren...

```
sprintf(strHex,"%x",atoi(strDez));
```
warum muss die sitch-case-sache denn bleiben, wenns einfacher geht?


----------



## devDevil (1. Dezember 2008)

Muggefronc: Wenn man die Qualität deines Beitrages bewerten sollte: 5- (in Schulnote). 
- Es handelt sich hierbei um eine C-Lösung (es sei denn du hast irgendwo folgendes stehen:

```
#include <cstring>
#include <cstdio>

using std::atoi;
using std::sprintf;
```
 aber davon kannst du nicht ausgehen, es sei denn du erwähnst dies.

- Es wurde bereits eine wesentlich elegantere und C++ eher entsprechende Lösung gepostet (vgl. engelmarkus, mcoder).
- Er hat explizit danach darauf hingewiesen das er es per switch-cast lösen will/muss, dann wird es wohl so sein!

Zum Problem: Solltest hier mitm Euklidischen Restalgorithmus (statt wie normal mit 2 jetzt mit 16) auskommen. Dann das ergebnis dieses immer durch deine switch-case-Konstruktion jagen und gut ist


----------



## Muggefronc (1. Dezember 2008)

ich glaub es geht hier nicht darum, beiträge zu bewerten. 
will ja keinem was böses, wenn ich meine idee poste. dass man auf die include selbst kommt hatte ich halt vorrausgesetzt.


----------



## keller64283 (1. Dezember 2008)

Vielen dank allen und seit wieder gut miteinander.
Es hat mir schon sehr geholfen.
Ich bekomme nun den Switch und auch die Berechnung leider noch nicht ganz flüssig. ich poste alles noch einmal. wo liegt der Fehler?
	
	
	



```
#include <iostream>
#include <conio.h>
#include <string>
#include <cstring>
#include <cstdio>
 
using std::atoi;
using std::sprintf;
using namespace std;
int main()
{
char f();
int a;
 char i;
 cout << "Eingabe: ";

cin >> i;

if ( i>0)
{
switch (i) 
{
case '1' : a=1; break;
case '2' : a=2; break;
case '3' : a=3; break;
case '4' : a=4; break;
case '5' : a=5; break;
case '6' : a=6; break;
case '7' : a=7; break;
case '8' : a=8; break;
case '9' : a=9; break;
case 'a' : a=10; break;
case 'b' : a=11; break;
case 'c' : a=12; break;
case 'd' : a=13; break;
case 'e' : a=14; break;
case 'f' : a=15; break;
default : i = 0;
}
cout << a<<endl;
}
if ( std::cin >> std::hex >> a);
{
std::cout << "DEC: " << a << std::endl
          << "HEX: " << std::hex << a << std::endl;
}
cout << a;
}
```


----------



## devDevil (1. Dezember 2008)

Tja Copy&Past is ja auch nicht das was du machen sollst. Das was du da stehen hast lässt zu 100% darauf schließen, dass du keine Ahnung hast, was du da machst.


```
#include <iostream>
#include <string>

int main()
{
    std::cout << "Eingabe (Hexadezimal): ";
    std::string input;
    std::cin >> input;

    {
        unsigned long result(0);
        unsigned char digit(0);
        for (std::string::iterator it(input.begin()); it != input.end(); ++it)
        {
            switch (*it) 
            {
                case '1': digit = 1; break;
                case '2': digit = 2; break;
                case '3': digit = 3; break;
                case '4': digit = 4; break;
                case '5': digit = 5; break;
                case '6': digit = 6; break;
                case '7': digit = 7; break;
                case '8': digit = 8; break;
                case '9': digit = 9; break;
                case 'a': digit = 10; break;
                case 'b': digit = 11; break;
                case 'c': digit = 12; break;
                case 'd': digit = 13; break;
                case 'e': digit = 14; break;
                case 'f': digit = 15; break;
            }
            if (digit == 0) { std::cerr << "ERROR: Invalid input!"; return 1; }
            result  = result * 16 + digit;
        }
        std::cout << "Ausgabe (Dezimal): " << result;
    }
    std::cin.ignore();
}
```
 Damit sind deine Hausaufgaben erledigt. Last Time


----------



## keller64283 (1. Dezember 2008)

Vielen vielen Dank. Ich lerne es auch noch, stand wirklich auf dem Schlauch.


----------



## bastl_the_rat (19. Mai 2010)

Die Lösung mit streams ist wirklich sehr elegant und überzeugend, bis auf einen Punkt - alle Beispiele, die ich gefunden habe, waren von cin oder nach cout... ob das ein Zufall ist Ich hab mich jetzt schon ein paar Stunden damit abgemüht Variablen (ohne I/O) via Streams zu konvertieren und gehe jetzt reumütig zu sprintf() zurück....

Wenn jemand mit streams ohne cin/cout konvertiert hat, bitte posten - würde mich echt interessieren.

Danke!!


----------



## Matthias Reitinger (19. Mai 2010)

bastl_the_rat hat gesagt.:


> Wenn jemand mit streams ohne cin/cout konvertiert hat, bitte posten - würde mich echt interessieren.




```
#include <iomanip>
#include <sstream>
#include <string>

int main(void) {
  std::string hexString("2a");
  int i;

  // Hex-String zu int  
  std::istringstream iss(hexString);
  iss >> std::hex >> i;

  // int zu Hex-String
  std::ostringstream oss;
  oss << std::hex << i;
  hexString = oss.str();  

  return 0;
}
```

Grüße,
Matthias


----------

