Announcement

Collapse
No announcement yet.

Teile einer HEX/DEZ auswerten

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Teile einer HEX/DEZ auswerten

    Hallo

    Vielleich hat jemand von euch eine Idee oder Hinweis.

    Ein Spezialproblem: Ich bekomme einen 32Bit Long-Zahl (kein Komma) welche ich decodieren muss.

    Beispiel

    Wert = 4009 (Long) = 00000000 00000000 01000000 00001001

    Ich benötige nur einen Abschnitt zb
    ab Bit 3 (offset) auf eine Länge von 3 Bit (size) -> 001 = 1 (Long)


    Mein bisheriger Idee für einen Lösungsansatz
    Wert & ...00111000 (56 DEC) = Teilabschnitt gefiltert
    Ergebnis=Teilabschnitt/2^3 (rückt nach rechts)

    00001001 -> 00000001

    Das Ergebnis sollte ganzzahling sein.


    Hat jemand einen Quellcode oder Verweis oder eine bessere Lösung.


    Vielen dank im voraus

  • #2
    Weitere Möglichkeiten:

    Den Wert shiften
    Die Stringverarbeitung nutzen

    Das Ergebnis sollte ganzzahling sein.
    Wie könnte das nicht so sein?

    Ich bekomme einen 32Bit Long-Zahl (kein Komma)
    Wie könnte ein long ein Komma enthalten?


    Wert = 4009 (Long) = 00000000 00000000 01000000 00001001
    ergibt bei mir 16393 und nicht 4009
    4009 = 111110101001
    0x4009 = 100000000001001

    Du solltest schon die korrekte Zahlenschreibweise nutzen, sonst weiss keiner wovon du sprichst


    Vielleicht erklärst du, warum du das mit XML/XLS realisieren willst? Crosspost?
    Zuletzt editiert von Christian Marquardt; 30.07.2011, 06:31.
    Christian

    Comment


    • #3
      Erstmal Danke für die Antwort.

      1) Tippfehler bei Binär - Danke war nur als Demo gedacht
      2) Crosspost - ja bewusst. Ich arbeite an einen MC Projekt wo Datentelegramme aufgelöst werden, hier benötige ich die Lösung in C++. Die Beschreibung dieser Telegramme wurden mir als XML File zu verfügunggestellt. Der Zugriff erfolgt entweder per MC ODER Browser (XSLT) daher benötige ich beide Lösungen.


      Stringverarbeitung - Die vier Bytes stehen auch als Array zur Verfügung - hier wirds schwierig mit Stringoperation.
      Wert shiften?


      Hast du einen Link mit einem Beispiel oder ähnlichen Lösung, ich würde es schneller verstehen.

      Comment


      • #4
        Stringverarbeitung - Die vier Bytes stehen auch als Array zur Verfügung - hier wirds schwierig mit Stringoperation.
        Man kann die Bytes nicht in bin-String umsetzen und aneinander fügen. Denke schon....

        Und shiften->

        Übernahme des Werte in ein Byte
        2x nach links shiften
        5x nach rechts shiften


        int eingabe=0x4009;
        byte wert=(byte)eingabe;
        wert=(byte)(wert<<2);
        wert=(byte)(wert>>5);


        Crosspost - ja bewusst.
        Wie sollten die Operationen in XML ablaufen?

        Des Weiteren: Wenn du eine Lösung hast, worüber reden wir hier?
        Zuletzt editiert von Christian Marquardt; 30.07.2011, 07:16.
        Christian

        Comment


        • #5
          Hier ein Beispiel aus der Realität

          Telegramm kommt Byte weise von Sensor und werden in ein Array geladen

          [0x00][0x00][0x40][0x09]
          00000000 00000000 01000000 00001001

          laut Hersteller

          Offset Size Data
          0 24 Meter reading
          24 4 Tarif info
          28 1 LRN Bit
          29 1 Datatype
          30 2 Divisor

          bezieht sich auf die kompletten 32 Bit wobei offset das Startbit ist.

          Die Lösung shift per Byte klappt hier nicht, oder habe ich das falsch verstanden.

          Lösung nein - Lösungsansatz ja (hoffe ich zumindest)

          Danke im voraus

          Comment


          • #6
            ab Bit 3 (offset) auf eine Länge von 3 Bit (size) -> 001 = 1 (Long)
            Dies ist die Anforderung aus deinem ersten Posting.

            Aus deinem letzten Posting kann ich nicht erkennen, was du machen willst. Solltest du tatsächlich alle Daten dort gemäß der Tabelle auslesen wollen,

            - ist das shiften über den ganzen Wert vorzunehmen (dann musst du ausrechnen, wie oft für jeden Wert nach Links/Rechts)
            - oder wie gesagt die Teile als String extrahieren...
            Christian

            Comment


            • #7
              Hallo Christian!

              Du hast recht - Ich habe mich schlecht ausgedrückt.

              Zusammenfassung:
              Ein Sensor liefert Daten per serielle Schnittstelle Byteweise.
              Diese werden in einen Array zwischengespeichert.

              Der Hersteller des Sensors fast in 4 Byts mehrer Information zusammen.


              zB wie obige Auflistung
              Ab Bit 24 mit einer Länge von 4 Bit, wird der Tarif festgelegt


              Meine erst Überlegung war, diese 4 Bytes in eine Long umzuwandeln und per AND zu filtern und dann per shift Daten nach rechts rücken. Daher meine ursprüngliche Fragestellung.

              Kann ich den Long Wert shiften? Wenn ich die 4 Bytes in eine String umwandle soll ich diese dann in long umwandeln. Ist shiften quasi ein Ersatz für AND Filter? (Das Beispiel wären 4 links danach 28 rechts)

              Bin bei Bitoperationen nicht ganz fix, lerne aber gerne
              Zuletzt editiert von mr_sol; 30.07.2011, 08:18.

              Comment


              • #8
                Kann ich den Long Wert shiften?
                Sicherlich
                Bsp. für das Byte vom ersten Posting

                00001001
                2x links
                00100100
                5x rechts
                00000001

                So kannst du das mit jedem Wert machen. Ist halt eine Fleißarbeit rauszufummel wieviel mal jeweils nach rechts und links geshiftet werden soll. Man kann das natürlich auch ausrechnen anhand der Angabe Offest und Länge. Fleißarbeit

                Versuch:
                Anzahl der Links-shifts=8-(offest+size)
                Anzahl der Rechts-shifts=8-size

                Wenn ich die 4 Bytes in eine String umwandle soll ich diese dann in long umwandeln.
                ja, wäre gut
                Christian

                Comment


                • #9
                  Super

                  Letzte Frage noch. Wie wandelt man die 4 Byte elegant in eine Long (Byteanzahl sind beide ja gleich) um?

                  Comment


                  • #10
                    http://www.velocityreviews.com/forums/t281116-byte-array-and-long.html
                    Christian

                    Comment


                    • #11
                      Vielen Dank ab jetzt sollte es klappen

                      Comment


                      • #12
                        Hier ist meine Lösung:

                        Code:
                        /** 
                        * 
                        */
                        unsigned long ByteToLong( byte const *bp, byte offset, byte size)
                        {
                          unsigned long value = bp[0];
                          value <<= 24;
                          value |= bp[1];
                          value <<= 16;
                          value |= bp[2];
                          value <<= 8;
                          value |= bp[3];
                        
                          value<<=32-(offset+size);
                          value>>=32-size;
                          
                        return(value);

                        Klappt wunderbar.
                        Frage wie mache ich Funktion etwas flexibler. Ich bin jetzt immer gezwungen 4 Byte einzugeben.

                        Ich würde gerne zwischen 1-4 Byte verwenden. Nicht immer sind 4 Byte vorhanden

                        Danke voraus.

                        Comment


                        • #13
                          Den shift-Wert (24,16,8) in eine Variable

                          Eine Schleife über das Array (bp)

                          Der shift-Wert wird je nach Größe des Arrrays mit einem Ausgangswert bestückt, von dem bei jedem Durchlauf 8 subtrahiert werden
                          Christian

                          Comment


                          • #14
                            Habe das ganze jetzt erweitert:

                            {0xA5,0x5A,0x0B,0x07,0x00,0x00,0x41,0x09,0x00,0x80 ,0x36,0x11,0x00,0x23};

                            Das gesammte Datentelegramm ist 11 Byte lang.

                            Ab Byte 5 auf eine Länge von 4 Byte befindet sich ein Datenblock.
                            in diese ab den 2 Bit auf eine Länge von 4 Bit
                            die gesuchten Daten.

                            Leider bekomme ich keine brauchbaren Ergebnisse (stehe etwas auf der Leitung)

                            Code:
                            
                            println(ByteToLong(Test,5,4,2,4));
                            
                            
                            
                            /** 
                            * Auslesen Daten aus einen Telegramm
                            * 
                            * Aus einen Datentelegramm welches serial verarbeitet wird, 
                            * werden Bytebloecke mit Informationen versehen (Startbyte: ByteOffset, Laenge:ByteSize)
                            * in diesem befinden sich widerum verteilte Information (Startbit:BitOffset ,Laenge:BitSize)
                            * Diese Teileinformation wird als Long retourniert
                            *
                            * @V0.1      2011.07.30 
                            */
                            unsigned long ByteToLong( byte const *bp, byte ByteOffset, byte ByteSize, byte BitOffset, byte BitSize)
                            {
                              
                              unsigned long value = bp[ByteOffset];
                              
                              for(byte a=ByteSize-1;a>0;--a)
                              {  
                              value <<= a*8;
                              value |= bp[ByteOffset+1];
                              }
                            
                              value<<=8*ByteSize-(BitOffset+BitSize);
                              value>>=8*ByteSize-BitSize;
                              
                            return(value);
                            
                            }

                            Danke im voraus

                            Comment


                            • #15
                              Wenn das 11 Byte sind, kannst du die doch nicht in einen long/int packen (4 Byte). Also ist doch die Schleife

                              for(byte a=ByteSize-3;a>4;--a)

                              auf die richtigen Byte zu setzen (ohne das jetzt getestet zu haben)
                              Christian

                              Comment

                              Working...
                              X