Hexadezimal (%02X) vergleichen mit int (%d)



  • Hallo Leute,

    Wie kann ich eine Hexadezimalzahl umwandelten bzw. vergleichen
    mit int oder char?!
    Hier waere ein Beispiel:

    protokoll 0xffffcdcf

    Diesen Wert muesste ich vergleichen koennen aber wie ?



  • Sobald du beiden Zahlen aus der ASCII-Darstellung in eine Zahl gewandelt hast reicht der einfach Vergleich.

    Die beiden Schreibweisen als Hex und Dec bezeichenen dieselbe Zahl eine int.



  • Hallo PAD,

    habe das mit sprintf gemacht in ein Char umgew., nun (strcmp)
    vergleichen ob CF oder CE bzw. 0 im protokoll steht - geht.

    Habe da noch ein anderes Problem, wo ich nicht dahinter komme.
    Ich habe 2 Typs Char mit "XX0XXX", aber unterschiedliche Werte:

    0x004dc7e0 "XX0XXX"
    0x004ae6c0 "XX0XXX"

    Vergleiche ich die 2 char Typen, sagt strcmp stimmt nicht ueberein,
    weil unterschiedliche Werte obwohl der inhalt gleich ist.
    Wo ran kann das liegen, obwohl gleicher inhalt ?!

    mfg Oliver Kern.



  • Poste mal bitte das Stück Code, ich werde aus deinem Text nicht ganz schlau

    Außerdem hätte ich eher aus

    "protokoll 0xffffcdcf"

    "protokoll" und "0xffffcdcf" gemacht
    dann "0xffffcdcf" mit sscanf in eine long int gewandelt und dann die int verglichen.

    Das gleiche hier
    0x004dc7e0 "XX0XXX"
    in "0x004dc7e0" und "XX0XXX" zerlegen
    "XX0XXX" mit sscanf in eine long int gewandelt das gleich mit der anderen Zeile und dann die beiden Werte verglichen.



  • Hallo Pad,

    hier erstmal den ausschnitt:

    char protokoll_erkennung(char *call, char *protokoll) {
     int a = 0;
    
     for (a = 0; a < route_tbl_top; a++) {
       // Tabelle checken
        if (strcmp(call, call_to_a(&route_tbl[a].callsign[0])) == 0) {
          // Rufzeichen (call) vergleichen mit dem Rufzeichen in der TB
            if (route_tbl[a].protokoll == 1) {
              // Hat Call Protokoll F0 ?
               if (strcmp(protokoll,"CE") == 0) {
                // haben wir im Protokoll CE stehen ?
    usw.
    

    Im VC++ 6.00 gibt verschiedene Debug-Fenster, was ich meine ist das
    Variablen-Fenter. Da stehen der Wert in HEX bzw. der inhalt einer Variable.
    char *call = 0x004dc7e0 "XX0XXX"

    Das sind die Werte im Kopf der funktionen, gehen wir weiter runter:

    call_to_a zurueckgegeben = 0x004ae6c0 "XX0XXX"
    strcmp zurueckgegeben = (void)

    Obwohl der inhalt der 2 char-typen, naemlich "XX0XXX", gleich ist, sagt
    strcmp nein ist ungleich.

    Woran liegt das, das die werte unterschiedlich sind
    0x004dc7e0
    0x004ae6c0
    aber der inhalt ist gleich
    "XX0XXX"
    "XX0XXX"

    Wer kann mir das erklaeren ?

    mfg Oliver Kern.



  • was enthält bitte call_to_a(&route_tbl[a].callsign[0])

    Ändere mal den Code wie folgt ab

    char protokoll_erkennung(char *call, char *protokoll) { 
     int a = 0; 
     int iTest =-4711; // Nur eine Testvariable mit bekanntem Inhalt !=0
     char *TestString;
     for (a = 0; a < route_tbl_top; a++) { 
       // Tabelle checken 
       TestString=call_to_a(&route_tbl[a].callsign[0]); 
        test=strcmp(call,TestString);
        if (test== 0) { 
          // Rufzeichen (call) vergleichen mit dem Rufzeichen in der TB 
            if (route_tbl[a].protokoll == 1) { 
              // Hat Call Protokoll F0 ? 
               if (strcmp(protokoll,"CE") == 0) { 
                // haben wir im Protokoll CE stehen ?
    

    Folgende Fragen
    Was steht in TestString nach Aufruf von call_to_a
    Was steht in iTest nach Aufruf von strcmp

    Wie ist der Prototyp von call_to_a, liefert er einen Pointer oder einen String zurück



  • Hallo PAD,

    mit deiner Version funktioniert das :)))

    was enthält bitte call_to_a(&route_tbl[a].callsign[0])

    Zurueckgegeben call_to_a = 0x004ae6c0 XX0XXX

    Was steht in TestString nach Aufruf von call_to_a

    Die selben Werte wie call_to_a(&route_tbl[a].callsign[0]),
    siehe oben.

    Was steht in iTest nach Aufruf von strcmp

    strcmp zurueckgegeben 0

    Wie ist der Prototyp von call_to_a, liefert er einen Pointer oder einen String zurück

    call_to_a liefert einen Pointer, hier ist der Prototyp

    char protokoll_erkennung(char *call,char *protokoll);
    

    Vielen Dank, so funktioniert das mit strcmp viel besser.

    mfg Oliver Kern.



  • müsste der Prototyp für nicht

    char *protokoll_erkennung(char *call,char *protokoll);
    

    um einen Pointer zu liefern.

    Mach aus

    test=strcmp(call,TestString); 
        if (test== 0) {
    

    Mach aus

    if (0==strcmp(call,TestString); ) {
    

    und wirf die Variablendeklaration für Test Weg.

    Prinzipiell hilft es beim debuggen nicht funktionierende Stücke in mehrere
    Zeilen mit Zwischenergebnissen aufzuteilen. Dann kann man besser kontrolieren
    wo es schief geht

    Noch eine Erklarung zum Debugger 0x004ae6c0 ist die Speicheradresse an der die
    Variable im Processraum steht das Dahinter ist der Inhalt der Variablen


Anmelden zum Antworten