kleinerroemer: Primitve HEX Type

Hi Leute!

Nach langem versuchen das <a href="http://forum.de.selfhtml.org/?t=153242&m=997028">Problem </a> zu lösen, bin ich jetzt wieder am Anfang angekommen!

Um nochmal kurz zu erwähen worum es sich dreht:

Ich habe ein Perlskript geschrieben, welches über snmp Informationen über Rechner im Netzwerk sammelt,
und diese in eine html Seite schreibt.

Alles funktioniert soweit ganz gut, nur habe ich "Probleme" bei der Mac Adresse.
Diese wird nämlich als HEX übertragen (nicht format sonder primitive Type).
Das kann ich mitlerweile sicher sagen, da ich den String einer Adresse mal in Ultra Edit kopiert hab,
und danch umgewandelt habe. Das Ergebnis hat mit der richtigen Adresse übereingestimmt.

Nun stellt sich mir die Frage, wie ich in Perl den HEX raw Type in einen lesbaren String umwandeln kann....
hab schon recht viel Zeit mit suchen verbracht, war aber bisher erfolglos...

Hoffe es kann mir wer von euch Helfen...

lg. KleinerRoemer

  1. Nun stellt sich mir die Frage, wie ich in Perl den HEX raw Type in einen lesbaren String umwandeln kann....

    ich würd mal sagen mit pack

    Ich muss aber sagen, dass ich pack nach Jahren noch nicht verstanden habe und daher keinen konkreter Tipp geben kann.

    Struppi.

    --
    Javascript ist toll (Perl auch!)
    1. ich würd mal sagen mit pack

      Sieht anundfürsich vielversprechend aus aber...

      Ich muss aber sagen, dass ich pack nach Jahren noch nicht verstanden habe und daher keinen konkreter Tipp geben kann.

      Ich habe von allen Formatangaben die man geben kann, keine gefunden die sich auf mein Szenario anwenden lässt...

      lg. Roemer

      1. Ich habe von allen Formatangaben die man geben kann, keine gefunden die sich auf mein Szenario anwenden lässt...

        Nicht?

        Ich habe jetzt keine Lust den alten Thread durchzuwühlen um nach Hinweisen zu fahnden, was du in was umwandeln möchtest. (Es gilt hier auch als unhöflich eine Folgefrage in einem neuen Thread zu stellen, aber wenigsten eine konkrete Beschreibung was du machen willst, wäre nett gewesen)

        Struppi.

        --
        Javascript ist toll (Perl auch!)
        1. Nicht?

          Ich habe jetzt keine Lust den alten Thread durchzuwühlen um nach Hinweisen zu fahnden, was du in was umwandeln möchtest. (Es gilt hier auch als unhöflich eine Folgefrage in einem neuen Thread zu stellen,

          Das tut mir leid.. ich dachte nachdem der alte thread ja schon "alt" ist und ich einen neuen Ansatz suche, mache ihc einen neuen auf... naja wird nicht mehr vorkommen...

          aber wenigsten eine konkrete Beschreibung was du machen willst, wäre nett gewesen)

          also:
          der wert den ich in meine SNMP-Request erhalte sieht wenn ich ihn ausgebe ca so aus:
          0"Û (wobei 2 von selfhtml als "steuerzeichen" erkannte Zeichen dazwischen sind welche ich gelöscht habe ).
          diese zeichen repräsentieren eine mac Adresse:
          0:30:5:22:5:db (also die 5er fehlen oben).

          wenn ich den string den ich erhalte in UltraEdit kopiere, und von Hex in ASCII umwandle, stimmt das Ergebnis mit der Mac Adresse überein.

          Jetzt muss ich also einen Weg finden, um in Perl aus den HEX Zeichen die ASCII Zeichen zu gewinnen...

          hoffe das ich mein Problem jetzt halbwegs gut erklärt habe...

          lg. Roemer

          1. Also Leute ich weiß schon nicht mehr was ich noch probieren soll... ich komm einfach nicht dahinter... hab mich jetzt noch mit chr(), ord() hex() gespielt.. bin aber auf keine Ergebnisse gekommen...

            bin echt Dankbar für Ideen..

            lg

            1. Also Leute ich weiß schon nicht mehr was ich noch probieren soll... ich komm einfach nicht dahinter... hab mich jetzt noch mit chr(), ord() hex() gespielt.. bin aber auf keine Ergebnisse gekommen...

              Wenn ich das richtig sehe, willst du die Werte der einzelnen Zeichen, dann müßte  ord() das tun was du willst.

              Struppi.

              --
              Javascript ist toll (Perl auch!)
              1. Wenn ich das richtig sehe, willst du die Werte der einzelnen Zeichen, dann müßte  ord() das tun was du willst.

                Ja da hast du recht.. hab ich mir auch gedacht...

                ich glaub ich bin schon übersättigt von dem thema.. ich seh mich schon garnicht mehr raus...

                naja.. wenn ich ein ord() auf das ergebnis des snmp requests mache.. bekomme ich folgendes ergebnis:

                0:48:5:34:5:219:  wobei ':' von mir nach jedem char hinzugefügt wurde

                die mac adresse lautet:
                0:30:5:22:5:db

                sieht ja im prinzip eh schon ganz gut aus nur muss ich die werte noch irgendwie umwandeln.. nur weiß ich nicht wie...

                danke mal für die Hilfe..
                lg

                1. ich glaub ich bin schon übersättigt von dem thema.. ich seh mich schon garnicht mehr raus...

                  Na ich bin ja wirklcih schon ganz am Ende....

                  0:48:5:34:5:219:  wobei ':' von mir nach jedem char hinzugefügt wurde

                  die mac adresse lautet:
                  0:30:5:22:5:db

                  da hätt ichs mir eh nur einmal so schön hinschreiben müssen..
                  das sind ja jetzt meine hexwerte.... 48dec = 30hex usw...

                  ach gott

                  naja danke vielmals für die Hilfe!!!

                  lg!

                  1. ich glaub ich bin schon übersättigt von dem thema.. ich seh mich schon garnicht mehr raus...
                    Na ich bin ja wirklcih schon ganz am Ende....

                    0:48:5:34:5:219:  wobei ':' von mir nach jedem char hinzugefügt wurde

                    die mac adresse lautet:
                    0:30:5:22:5:db

                    da hätt ichs mir eh nur einmal so schön hinschreiben müssen..
                    das sind ja jetzt meine hexwerte.... 48dec = 30hex usw...

                    Das du diese umwandelst davon hast du nichts geschrieben
                    Wenn du Dezimalzahlen haben willst, sollte sowas gehen:
                    my $out = join ':', map ord, split //, $in;

                    sollen es hex Zahlen sein:
                    my $out = join ':', map hex ord, split //, $in;

                    Struppi.

                    --
                    Javascript ist toll (Perl auch!)
                    1. Das du diese umwandelst davon hast du nichts geschrieben
                      Wenn du Dezimalzahlen haben willst, sollte sowas gehen:
                      my $out = join ':', map ord, split //, $in;

                      sollen es hex Zahlen sein:
                      my $out = join ':', map hex ord, split //, $in;

                      Na haut so nicht so richtig hin.. aber ich hab eh sofort im Internet eine funktion gefunden die das übernimmt.. also haut jetzt alles tadellos hin.. danke nochmal!

                      1. Na haut so nicht so richtig hin.. aber ich hab eh sofort im Internet eine funktion gefunden die das übernimmt.. also haut jetzt alles tadellos hin..

                        hätte mich schon interessiert was das für eine Funktion ist.

                        Struppi.

                        --
                        Javascript ist toll (Perl auch!)
                        1. hätte mich schon interessiert was das für eine Funktion ist.

                          Struppi.

                          ist nichts besonderes.... copy paste sache hald...
                          man muss das Rad ja nicht 2 mal erfinden ;)

                          sub dec2hex {
                              # parameter passed to
                              # the subfunction
                              my $decnum = $_[0];
                              # the final hex number
                              my $hexnum;
                              my $tempval;

                          return "00" if( $decnum == 0 );

                          while ($decnum != 0) {
                              # get the remainder (modulus function)
                              # by dividing by 16
                               $tempval = $decnum % 16;
                               # convert to the appropriate letter
                               # if the value is greater than 9
                               if ($tempval > 9)
                            {
                             $tempval = chr($tempval + 55);
                               }
                               # 'concatenate' the number to
                               # what we have so far in what will
                               # be the final variable $hexnum = $tempval . $hexnum ;
                               # new actually divide by 16, and
                               # keep the integer value of the
                               # answer
                               $decnum = int($decnum / 16);
                               # if we cant divide by 16, this is the
                               # last step
                               if ($decnum < 16)
                            {
                               # convert to letters again..
                                if ($decnum > 9)
                             {
                                 $decnum = chr($decnum + 55);
                                }
                                # add this onto the final answer..
                                # reset decnum variable to zero so loop
                                # will exit
                                $hexnum = $decnum . $hexnum;
                                $decnum = 0
                               }
                              }
                              return $hexnum;
                          } # end sub

                          1. Hi,

                            man muss das Rad ja nicht 2 mal erfinden ;)
                            sub dec2hex {

                            #almost endless code

                            } # end sub

                            Warum ein zum 2. Mal erfundenes Rad benutzen?

                            Ein einfaches
                            $hexstr = sprintf "%x",$decimalnumber;
                            genügt.

                            cu,
                            Andreas

                            --
                            Warum nennt sich Andreas hier MudGuard?
                            O o ostern ...
                            Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
                            1. Warum ein zum 2. Mal erfundenes Rad benutzen?

                              »»
                              Naja war das erste was ich gefunden hab.. und hat auf anhieb funktioniert.. ;) war mir im Moment ziehmlich egal das der code unschön ist..

                              Ein einfaches
                              $hexstr = sprintf "%x",$decimalnumber;
                              genügt.

                              Ja hab jetzt eh die schöne variante von struppi verwendet..

                              cu,
                              Andreas

                              lg

                          2. hätte mich schon interessiert was das für eine Funktion ist.

                            Struppi.

                            ist nichts besonderes.... copy paste sache hald...
                            man muss das Rad ja nicht 2 mal erfinden ;)

                            Es gibt bereits einen Funktion in Perl die das macht:
                            printf

                            sub dec2hex {

                            da kommt bei mir immer 0 raus???

                            Aber jetzt kapier ich was du willst.
                            print join ':', map sprintf( '%x', ord), split //, $in;

                            $in ist der Wert den du erhälst.

                            Struppi.

                            --
                            Javascript ist toll (Perl auch!)
                            1. Aber jetzt kapier ich was du willst.
                              print join ':', map sprintf( '%x', ord), split //, $in;

                              $in ist der Wert den du erhälst.

                              Hehe.. das is mir doch schon lieber als diese komische dec2hex funktiont... ;)

                              danke vielmals...

                              aber.. nur so interesse halber ;)

                              das map wendet auf jedes element von sprintf ein split an, und das join fügt sie dann wieder mit doppelpunkt zusammen.. richtig..??

                              weil ich check ned ganz wieso mein input string da hinten steht..

                              das is hald der nachteil an so "inline" sachen

                              aber danke nochmal lg..

                              P.s. ich hätte da noch eine kleine Frage bezüglich Fork..
                              soll ich da einen neuen thread machen oder hier weiter schreiben..?

                              1. Aber jetzt kapier ich was du willst.
                                print join ':', map sprintf( '%x', ord), split //, $in;

                                aber.. nur so interesse halber ;)

                                das map wendet auf jedes element von sprintf ein split an, und das join fügt sie dann wieder mit doppelpunkt zusammen.. richtig..??

                                Nö - du musst das eher von rechts nach links lesen.
                                erst split //, $in damit erhälst du ein Array der einzelnen Buchstaben des Strings.
                                und auf dieses Array wird das map angewandt, jedes Element (also jeder Buchstabe) wird mit dem sprintf "behandelt", der Rückgabewert von map ist ein array mit den umgewandelten Buchstabencodes, diese werden wieder zusammengefügt und dazwischen ein Doppelpunkt.

                                Es ist ein Kurzform für:

                                my $in = "...";  
                                my @tmp = split //, $in;  
                                my @new;  
                                foreach my $char(@tmp) {  
                                push @new, sprintf '%x', $char;  
                                }  
                                my $out = join ":", @new;
                                

                                P.s. ich hätte da noch eine kleine Frage bezüglich Fork..
                                soll ich da einen neuen thread machen oder hier weiter schreiben..?

                                Nö, mach was neues.

                                Struppi.

                                --
                                Javascript ist toll (Perl auch!)
                                1. Nö - du musst das eher von rechts nach links lesen.

                                  Alles klar.. danke vielmals.. so is es lesbar.. ;)

                                  lg. und danke nochmal für die HIlfe!!

                              2. print join ':', map sprintf( '%x', ord), split //, $in;
                                weil ich check ned ganz wieso mein input string da hinten steht..

                                Drösel das Ganze mal so auf und lies es von unten nach oben:

                                print  
                                  join ':',                # füge das Ergebnis zu einem String zusammen und trenne mittels ':'  
                                    map                    # wende die Formatierung auf jedes Arrayelement an  
                                      sprintf( '%x', ord), # formatieren als Hex-Zahl  
                                      split //, $in;       # zerlege $in in ein namenloses Array aller einzelnen Zeichen
                                

                                Vielleicht wird's so verständlicher.

                                Siechfred

                                --
                                Ein Selbständiger ist jemand, der bereit ist, 16 Stunden am Tag zu arbeiten, nur um nicht 8 Stunden für einen Anderen arbeiten zu müssen.
                                1. Vielleicht wird's so verständlicher.

                                  Ja passt.. danke dir!

                                  alles klar jetzt ;)

                2. naja.. wenn ich ein ord() auf das ergebnis des snmp requests mache.. bekomme ich folgendes ergebnis:

                  0:48:5:34:5:219:  wobei ':' von mir nach jedem char hinzugefügt wurde

                  die mac adresse lautet:
                  0:30:5:22:5:db

                  ich vermute einen Fehler beim umwandeln des strings oder du veränderst ihn. 48 ist eine 0 und 34 ist ein Anführungszeichen, d.h. diese müßtest du in deinem Ausgangstring auch sehen.

                  sieht ja im prinzip eh schon ganz gut aus nur muss ich die werte noch irgendwie umwandeln.. nur weiß ich nicht wie...

                  Wir auch nicht, ich kenn deinen Ausgangstring nicht.

                  Struppi.

                  --
                  Javascript ist toll (Perl auch!)