C++: Konvertieren von Hexadezimal in Dezimal

Lesezeit: 6 Minuten

Benutzer-Avatar
zeul

Ich suche nach einer Möglichkeit zu konvertieren hex(hexadezimal) zu dec(Dezimal) leicht. Ich habe einen einfachen Weg gefunden, dies zu tun:

int k = 0x265;
cout << k << endl;

Damit kann ich aber nichts eingeben 265. Gibt es überhaupt dafür, dass es so funktioniert:

Eingang: 265

Ausgabe: 613

Gibt es das überhaupt zu tun?

Notiz: Ich habe es versucht:

int k = 0x, b;
cin >> b;
cout << k + b << endl;

und es funktioniert nicht.

  • Das ist nicht klar. 0x265 ist 613 in Dezimalzahl. Was hast du erwartet?

    – Oliver Charlesworth

    14. Juni 2012 um 10:26 Uhr

  • @Esailija Ich denke, es konvertiert stattdessen int in hex.

    – Zeulb

    14. Juni 2012 um 10:27 Uhr

  • Mögliches Duplikat: stackoverflow.com/q/676763/769220

    – Chris

    14. Juni 2012 um 10:41 Uhr

  • und hier: stackoverflow.com/q/819487/769220

    – Chris

    14. Juni 2012 um 10:42 Uhr

  • mögliches Duplikat von C++ Hex-String in vorzeichenbehaftete Ganzzahl konvertieren

    – Quetzalcoatl

    2. Juli 2013 um 22:17 Uhr

Benutzer-Avatar
smichak

#include <iostream>
#include <iomanip>
#include <sstream>

int main()
{
    int x, y;
    std::stringstream stream;

    std::cin >> x;
    stream << x;
    stream >> std::hex >> y;
    std::cout << y;

    return 0;
}

  • Warum der Zwischen-Stringstream. Warum nicht einfach cin >> hex >> y?

    – Oliver Charlesworth

    14. Juni 2012 um 11:45 Uhr

  • brauchst du nicht #include ?

    – xinthose

    29. Juni 2015 um 17:51 Uhr

Benutzen std::hex Manipulator:

#include <iostream>
#include <iomanip>

int main()
{
    int x;
    std::cin >> std::hex >> x;
    std::cout << x << std::endl;

    return 0;
}

  • wie auch immer, um dies ohne Eingabe zu tun? weil ich die ursprüngliche Eingabe für etwas anderes verwenden möchte

    – Zeulb

    14. Juni 2012 um 10:38 Uhr


  • @zeulb, weiß nicht genau was du meinst. Aber du kehrst zurück cin dezimal by verwenden std::cin >> std::dec;

    – hmjd

    14. Juni 2012 um 10:42 Uhr

  • Ich meine, ich möchte sowohl Hex als auch Dezimal für zwei verschiedene Variablen verwenden

    – Zeulb

    14. Juni 2012 um 10:43 Uhr


  • Wie die Eingabe erfolgt ist (Hex oder Dezimal) hat keinen Einfluss auf die interne Darstellung der int-Variable(n), na und? Bitte drücken Sie sich klarer aus. Möchten Sie die Werte aus dem Stream in zwei Variablen innerhalb derselben Anweisung speichern??

    – πάντα ῥεῖ

    14. Juni 2012 um 10:48 Uhr


  • wie ich ‘cin >> hex >> k;’ verwende, dann gebe ich 265 ein, jetzt war der k-wert 613. was ich möchte, ist, 265 auf der variablen p zu speichern. und 613 bleiben auf Variable k. Entschuldigung für mein schlechtes Englisch.

    – Zeulb

    14. Juni 2012 um 10:51 Uhr


Nun, der C-Weg könnte so etwas sein wie …

#include <stdlib.h>
#include <stdio.h>

int main()
{
        int n;
        scanf("%d", &n);
        printf("%X", n);

        exit(0);
}

Hier ist eine Lösung, die Zeichenfolgen verwendet und sie mit ASCII-Tabellen in Dezimalzahlen umwandelt:

#include <iostream>
#include <string>
#include "math.h"
using namespace std;
unsigned long hex2dec(string hex)
{
    unsigned long result = 0;
    for (int i=0; i<hex.length(); i++) {
        if (hex[i]>=48 && hex[i]<=57)
        {
            result += (hex[i]-48)*pow(16,hex.length()-i-1);
        } else if (hex[i]>=65 && hex[i]<=70) {
            result += (hex[i]-55)*pow(16,hex.length( )-i-1);
        } else if (hex[i]>=97 && hex[i]<=102) {
            result += (hex[i]-87)*pow(16,hex.length()-i-1);
        }
    }
    return result;
}

int main(int argc, const char * argv[]) {
    string hex_str;
    cin >> hex_str;
    cout << hex2dec(hex_str) << endl;
    return 0;
}

Ich benutze das:

template <typename T>
bool fromHex(const std::string& hexValue, T& result)
{
    std::stringstream ss;
    ss << std::hex << hexValue;
    ss >> result;

    return !ss.fail();
}

Benutzer-Avatar
101Dolmationen

    std::cout << "Enter decimal number: " ;
    std::cin >> input ;

    std::cout << "0x" << std::hex << input << '\n' ;

Wenn Sie eine Eingabe hinzufügen, die ein boolescher oder Float- oder Int-Wert sein kann, wird sie im int-Hauptfunktionsaufruf zurückgegeben …

Mit Funktionsvorlagen, basierend auf Argumenttypen, generiert C separate Funktionen, um jeden Aufruftyp angemessen zu handhaben. Alle Definitionen von Funktionsvorlagen beginnen mit dem Schlüsselwort Vorlage, gefolgt von Argumenten in spitzen Klammern < und >. Für die Art der zu testenden Daten wird ein einziger formaler Parameter T verwendet.

Betrachten Sie das folgende Programm, in dem der Benutzer aufgefordert wird, eine Ganzzahl und dann eine Gleitkommazahl einzugeben, wobei jedes die Quadratfunktion verwendet, um das Quadrat zu bestimmen. Mit Funktionsvorlagen, basierend auf Argumenttypen, generiert C separate Funktionen, um jeden Aufruftyp angemessen zu handhaben. Alle Definitionen von Funktionsvorlagen beginnen mit dem Schlüsselwort Vorlage, gefolgt von Argumenten in spitzen Klammern < und >. Für die Art der zu testenden Daten wird ein einziger formaler Parameter T verwendet.

Betrachten Sie das folgende Programm, in dem der Benutzer aufgefordert wird, eine Ganzzahl und dann eine Gleitkommazahl einzugeben, wobei jedes die Quadratfunktion verwendet, um das Quadrat zu bestimmen.

#include <iostream>
 using namespace std;
template <class T>      // function template
T square(T);    /* returns a value of type T and accepts                  type T     (int or float or whatever) */
  void main()
{
int x, y;
float w, z;
cout << "Enter a integer:  ";
cin >> x;
y = square(x);
cout << "The square of that number is:  " << y << endl;
cout << "Enter a float:  ";
cin >> w;
z = square(w);
cout << "The square of that number is:  " << z << endl;
}

template <class T>      // function template
T square(T u) //accepts a parameter u of type T (int or float)
{
return u * u;
}

Here is the output:

Enter a integer:  5
The square of that number is:  25
Enter a float:  5.3
The square of that number is:  28.09

Dies sollte auch funktionieren.

#include <ctype.h>
#include <string.h>

template<typename T = unsigned int>
T Hex2Int(const char* const Hexstr, bool* Overflow)
{
    if (!Hexstr)
        return false;
    if (Overflow)
        *Overflow = false;

    auto between = [](char val, char c1, char c2) { return val >= c1 && val <= c2; };
    size_t len = strlen(Hexstr);
    T result = 0;

    for (size_t i = 0, offset = sizeof(T) << 3; i < len && (int)offset > 0; i++)
    {
        if (between(Hexstr[i], '0', '9'))
            result = result << 4 ^ Hexstr[i] - '0';
        else if (between(tolower(Hexstr[i]), 'a', 'f'))
            result = result << 4 ^ tolower(Hexstr[i]) - ('a' - 10); // Remove the decimal part;
        offset -= 4;
    }
    if (((len + ((len % 2) != 0)) << 2) > (sizeof(T) << 3) && Overflow)
        *Overflow = true;
    return result;
}

Der Parameter „Overflow“ ist optional, Sie können ihn also NULL lassen.

Beispiel:

auto result = Hex2Int("C0ffee", NULL);
auto result2 = Hex2Int<long>("DeadC0ffe", NULL);

1013000cookie-checkC++: Konvertieren von Hexadezimal in Dezimal

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy