Hex nach Dez???



  • Hallo Profis

    ich habe da ein Problem und stundenlanges googeln hat mich dabei nur noch mehr verwirrt. Darum jetzt hier die Frage.

    ich habe ein array mit Werten die hexadezimal kodiert sind
    nun brauche ich davon die dezimalen Werte
    klingt erstmal simpel
    aber in dem array sind Werte die vier Byte und auch welche die beispielsweise nur 1 Byte benutzen.

    Bsp. 000003CC -> 972
    13 -> 19

    meine erste idee war das ich einfach jedes Byte nochmal auseinandernehme und dann nach der guten alten hex nach dez Berechnung das ganze wieder zusammenbaue

    also 13 -> 3 * 160 + 1 * 161 = 19

    aber die Frage ist wie komme ich an die einzelnen "ByteWerte" ran

    hat jemand eine Idee wie ich das Problem lösen kann oder weiß jemand noch eine viel viel komfortableren Weg
    Bin für alle Vorschläge offen.

    Gruß
    Sebastian



  • Hi,

    DerHD schrieb:

    ...ich habe ein array mit Werten die hexadezimal kodiert sind...

    hmmmm - das ist so nicht eindeutig beschrieben.
    Du könntest z.B. meinen:

    std::string hexStr = "000003CC";
       int hexInt = 0x000003CC;
    

    im ersten Fall kommst Du mit std::istringstream aus <sstream> und std::hex aus <iomanip> weiter.
    Im zweiten brauchst Du gar nichts zu tun, weil ein int ein int ist... wenn Du es dezimal ausgeben willst, macht das der passende operator<<() direkt für Dich.

    cout << hexInt;
       // oder, wenn Du es in einen string haben möchtest:
       std::ostringstream s;
       s << hexInt; // s.str() liefert Dir den string
    

    Gruß,

    Simon2.



  • Wenn Du einen Hex-Buchstaben (besser Ziffer) ein den Wert umwandelst, einfach

    char  c;
    
    c = '9' - '0';
    

    Das '9' hat den Wert 57, zieht man davon den Wert von '0' (di 48) ab, bleibt
    der Zahlenwert 9 übrig. Für Ziffern > 9 dann nochmal 7 dazuzählen.



  • Scheppertreiber schrieb:

    Wenn Du einen Hex-Buchstaben (besser Ziffer) ein den Wert umwandelst, einfach

    char  c;
    
    c = '9' - '0';
    

    Das '9' hat den Wert 57, zieht man davon den Wert von '0' (di 48) ab, bleibt
    der Zahlenwert 9 übrig. Für Ziffern > 9 dann nochmal 7 dazuzählen.

    Man könnte es auch in Assembler machen. ... oder Treiber für einen automatischen Lochkartenstanzer und Scanner.
    😉

    Mal ehrlich: Warum sollte man das so tun?

    Gruß,

    Simon2.


  • Administrator

    Simon2 schrieb:

    Scheppertreiber schrieb:

    Wenn Du einen Hex-Buchstaben (besser Ziffer) ein den Wert umwandelst, einfach

    char  c;
    
    c = '9' - '0';
    

    Das '9' hat den Wert 57, zieht man davon den Wert von '0' (di 48) ab, bleibt
    der Zahlenwert 9 übrig. Für Ziffern > 9 dann nochmal 7 dazuzählen.

    Mal ehrlich: Warum sollte man das so tun?

    Um Fehler zu erreichen. Es steht schliesslich nirgends im Standard, dass '9' den Wert 57 geschweige denn '0' den Wert 48 haben muss. Es steht sogar nicht mal etwas drin, in welcher Reihenfolge die Zeichen vorkommen müssen. Anders gesagt, ist das ganz sicher kein standardsicheres Verfahren und führt irgendwann einmal sicher zu einem Fehler, der nur sehr schwer aufzufinden ist.

    Grüssli



  • Dravere schrieb:

    ...führt irgendwann einmal sicher zu einem Fehler, der nur sehr schwer aufzufinden ist.

    Grüssli

    Naja - ich bin zwar auch strikt gegen dieses "Verfahren", aber sooo schwer sollten die Fehler nicht zu finden sein, solange die Maschine ihren Zeichensatz nicht nach Lust&Laune ändert ... 😉

    Gruß,

    Simon2.


  • Administrator

    Simon2 schrieb:

    Naja - ich bin zwar auch strikt gegen dieses "Verfahren", aber sooo schwer sollten die Fehler nicht zu finden sein, solange die Maschine ihren Zeichensatz nicht nach Lust&Laune ändert ... 😉

    Stell dir vor, du gibst den Code weiter oder ziehst auf eine neue Maschine oder wechselst das Betriebsystem, vielleicht auch einen neuen Kompiler/Entwicklungsumgebung. Plötzlich jedenfalls durch eine Aktion ändert sich der Zeichensatz. Da man dich im Glauben gelassen hat, dass der Zeichensatz vom Standard gerantiert wird, wirst du wohl einige Stunden, wenn nicht sogar Tage an Zeit verlieren, wegen diesem Fehler. Schliesslich wirst du den Fehler nicht im Code suchen, sondern in den veränderten Bedingungen. Dies kostet Zeit, schon nur weil du herausfinden musst, dass der Zeichensatz nicht standardisiert ist. Und jede Minute ist grundsätzlich verschwendete Zeit, da man den Fehler von anfang an hätte vermeiden können.

    Grüssli



  • Ich denke, ASCII sollte man voraussetzen können.



  • Dravere schrieb:

    ...Plötzlich jedenfalls durch eine Aktion ändert sich der Zeichensatz. ...

    Das widerspräche natürlich meiner Voraussetzung:

    Simon2 schrieb:

    ...solange die Maschine ihren Zeichensatz nicht nach Lust&Laune ändert ... 😉

    Dravere schrieb:

    ...
    Da man dich im Glauben gelassen hat, dass der Zeichensatz vom Standard gerantiert wird, ...

    Habe ich nie geglaubt...

    Dravere schrieb:

    ...Schliesslich wirst du den Fehler nicht im Code suchen, sondern in den veränderten Bedingungen....

    Was ja auch korrekt ist, weil schließlich diese "...Änderung in den Bedingungen..." den Zeichensatz verändert hat. Und wenn Du etwas auf der Maschine betreibst, das den zugrundeliegenden Zeichensatz ändert, sollte das irgendwo in der Change-Doku auftauchen.

    Michael E. schrieb:

    Ich denke, ASCII sollte man voraussetzen können.

    Mitnichten, junger Padawan.
    Mal abgesehen von diversen ASCII-Varianten, ist EBCDIC auch noch recht verbreitet... Ich könnte es mir hier auf der Arbeit jedenfalls nicht leisten, mich auf ASCII zu verlassen.

    Gruß,

    Simon2.



  • OK, ich verbesser mich: Dass die '9' neun Stellen hinter der '0' stehen sollte, kann man voraussetzen (auch wenns mitnichten schöner Stil ist).

    Wo arbeitest du?



  • Bleibt mal locker. Bis jetzt lief so Code mit - '0' noch auf JEDER Maschine, die ich benutzt habe. Außerdem seht ihr doch an der Art wie er die Frage stellt, dass der Threadstarter Anfänger ist, da wird er sein Programm bestimmt nicht auf total exotische Plattformen portieren wollen. Manchmal kann man es mit der Standard-Klugscheisserei wirklich übertreiben.


  • Administrator

    Simon2 schrieb:

    Dravere schrieb:

    ...
    Da man dich im Glauben gelassen hat, dass der Zeichensatz vom Standard gerantiert wird, ...

    Habe ich nie geglaubt...

    "dich" im Sinne von dir in der Haut des Threaderstellers. 😉

    @Standardklugscheisserei,
    Kurz und einfach gefragt:
    Wieso etwas auf eine Art erledigen, welche nicht garantiert fehlerfrei läuft, wenn es eine einfache und per Standard fehlerfreie Alternative gibt?
    Und man bringt den Leuten am besten die fehlerfreie Methode bei und die Leute, welche die nicht fehlerfreie Methode "predigen" sollten schon bald auf den Pfad der Erleuchtung gebracht werden ... Und so sprach Gott ... Eeeeeh, falscher Text 😃
    Aber ich denke es ist klar was ich meine 😉

    Grüssli



  • Michael E. schrieb:

    ...Wo arbeitest du?

    Bankenrechenzentrum.
    Da gibt's Großrechner, Unix-Server, Desktops, Kryptokarten, Chipkarten, ... unter zOS, AIX, Linux, Solaris, Windows mit Java, C, C++, COBOL, PL1, ASM, ... zu programmieren.
    Natürlich nicht alles von mir, aber Plattform- und besonders Zeichensatzunabhängigkeit ist das A&O dabei.

    Mal ganz abgesehen von der Frage, wieviele Bytes zwischen '0' und '9' liegen, muss man sich bei dieser "Handmethode" z.B. auch noch um
    - Rechnen zu anderen Basen (Hex),
    - Fehlerhandling (wie mit "Nichtziffern" umgehen?) und
    - Dokumentation
    manuell kümmern.
    ... und da stellt sich IMHO schon die Frage (wie sie auch Dravere sie stellt): Wofür das Ganze, wo es doch einen einfachen und sicheren Standardweg gibt?

    Gruß,

    Simon2.



  • Und darum machen wir alle ein switch-case von '0' bis '9' !



  • Simon2 schrieb:

    ... und da stellt sich IMHO schon die Frage (wie sie auch Dravere sie stellt): Wofür das Ganze, wo es doch einen einfachen und sicheren Standardweg gibt?

    Gruß,

    Simon2.

    Michael E. schrieb:

    (auch wenns mitnichten schöner Stil ist)

    Simon2 schrieb:

    Bankenrechenzentrum.

    Hört sich interessant an.



  • Michael E. schrieb:

    ...

    Simon2 schrieb:

    Bankenrechenzentrum.

    Hört sich interessant an.

    Ist es im Wesentlichen auch. Leider wird meine Arbeit in immer größerem Maß von "Politik" bestimmt und immer weniger von fachlichen oder technischen Herausforderungen... 🙄 😡
    Da diskutiert man 3 Monate für eine 5-PT-Änderung, weil sie politisch nicht opportun erscheint (weil irgendwelche Leute ihre Privatfehden austragen; weil welche meinen, sich "besser aufzustellen", wenn sie prinzipiell dagegen sind; weil "wir das immer schon so gemacht haben"; weil "wir das vor 3 Jahren so beschlossen (und schon damals nicht vernünftig durchdacht) haben"; ...).

    Ist manchmal ein wenig frustig - aber wenn man dann ans Arbeiten kommt und das Zeug irgendwann mal "produktiv genutzt" wird, ist es großartig!! 😃 😃

    Gruß,

    Simon2.



  • Hmm.. nettes OT Gespräch..
    Simon2, du bist ja so ein guter Freund von mir. Kannst du nicht mal eben etwas sechsstelliges auf mein Konto überweisen? 😉



  • drakon schrieb:

    Hmm.. nettes OT Gespräch..
    Simon2, du bist ja so ein guter Freund von mir. Kannst du nicht mal eben etwas sechsstelliges auf mein Konto überweisen? 😉

    Leider arbeite ich genau in der Abteilung, die sowas verhindert. :p 😉
    (Es gab mal eine Statistik, dass 5% der Angriffe auf Banksysteme von Insidern passieren ... diese aber 95% des Schadens verursachen. Inzwischen dürfte diese Statistik aber anders aussehen)

    Gruß,

    Simon2.



  • Scheppertreiber schrieb:

    Wenn Du einen Hex-Buchstaben (besser Ziffer) ein den Wert umwandelst, einfach

    char  c;
    
    c = '9' - '0';
    

    Das '9' hat den Wert 57, zieht man davon den Wert von '0' (di 48) ab, bleibt
    der Zahlenwert 9 übrig. Für Ziffern > 9 dann nochmal 7 dazuzählen.

    Das wird von A...F schon frickeliger, weil Du einen Offset brauchst und ggf. zwischen Klein- und Großbuchstaben unterscheiden mußt. Die einzige Methode, die auf jedem System funktionieren sollte: Man legt sich ein Array mit allen 16 möglichen HexZiffern an und sucht das Zeichen darin. Wird es gefunden, dann ist der Index der Wert.



  • c++fan 2008 schrieb:

    ...Wird es gefunden, dann ist der Index der Wert.

    hmmm, aber leider können 'a' und 'A' nicht denselben Index haben.

    Da müsste man "weiterfrickeln (vorher jedesmal ein toupper(), die erlaubten Zeichen als Index nehmen (Problem: ungültige Zeichen erkennen), ....).

    Also nochmal (Los Dravere! Nochmal im Duett): Warum sollte man das tun?

    Gruß,

    Simon2.



  • Simon2 schrieb:

    Warum sollte man das tun?

    Weil man es selbst programmieren will? Fertige Lösungen gibt es genug, wie etwa sscanf und stringstream.


Anmelden zum Antworten