HEX -> DEX mit BC nur bis 16bit ?

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von theborg, 16.09.2010.

  1. #1 theborg, 16.09.2010
    theborg

    theborg KBitdefender Programierer

    Dabei seit:
    06.08.2004
    Beiträge:
    688
    Zustimmungen:
    0
    Ort:
    Hamburg
    Hi,

    Ich hab mal wieder ein kleines Problem mit nem Shellscript und zwar bekomme ich 16bit werte von den Sensoren, die möchte ich mit BC nach DEC umwandeln dabei hab ich aber mehrere Probleme.

    1.) BC rechnet nur bis 8bit um b.z.w. wen ich beide werte zusammen füge und dann als 32bit hex Wert umrechnen möchte geht das nicht.
    2.) BC rechnet nicht wen ein Wert ne 0 am Anfang hat
    Variante 1
    Code:
    ### Z-Ackse Auslesen ###
    ZMSB=$(i2cget -y s3c2410-i2c 0x38 0x07 w |awk -F "0x" '{print $2}')   # MSB Auslesen und 0x entfernen
    ZLSB=$(i2cget -y s3c2410-i2c 0x38 0x06 w |awk -F "0x" '{print $2}')   # LSB Auslesen und 0x entfernen
    echo $ZMSB
    echo $ZLSB
    
    ZMSB=$(echo "ibase=16; $ZMSB" | bc)                                   # umwandeln HEX->DEC
    ZLSB=$(echo "ibase=16; $ZLSB" | bc)
                                                                                                          
    echo $ZMSB                                                                                            
    echo $ZLSB                                                                                            
                                                                                                          
    let Z=$ZMSB*$ZLSB                                                                              
    
    echo $Z
    
    Variante 2
    Code:
    ### Z-Ackse Auslesen ###
    ZMSB=$(i2cget -y s3c2410-i2c 0x38 0x07 w |awk -F "0x" '{print $2}')   # MSB Auslesen und 0x entfernen
    ZLSB=$(i2cget -y s3c2410-i2c 0x38 0x06 w |awk -F "0x" '{print $2}')   # LSB Auslesen und 0x entfernen
    echo $ZMSB
    echo $ZLSB
    
    Z=$(echo "ibase=16; $ZMSB$ZLSB" | bc)                                   # umwandeln HEX->DEC
                                                                                                          
    echo $Z                                                                                            
    
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 HeadCrash, 16.09.2010
    HeadCrash

    HeadCrash Routinier

    Dabei seit:
    16.05.2009
    Beiträge:
    482
    Zustimmungen:
    1
    Ort:
    Bayern
    Hi,

    Code:
    # 16 bit
    $ echo "ibase=16; FFFF" | bc
    65535
    # 32 bit
    $ echo "ibase=16; FFFFFFFF" | bc
    4294967295
    $ echo "ibase=16; 0FFFFFFF" | bc
    268435455
    
    geht bei mir. Ich würde auf einen Zeilenumbruch oder Sowas in der Art tippen.

    mfg
    HeadCrash
     
  4. #3 floyd62, 16.09.2010
    floyd62

    floyd62 Routinier

    Dabei seit:
    01.05.2007
    Beiträge:
    309
    Zustimmungen:
    0
    Hi,

    ich nehme einfach mal an, du verwendest GNU-BC, Bash, Linux ... BC sollte Zahlen in beliebiger Länge verarbeiten können. Könntest du mal den Output liefern, den dein Skript bringt? Interessant wäre auch noch, was rauskommt, wenn du vor den Aufruf von bc jweils noch z.B. ein "... | tee /dev/tty | bc" einbauen könntest, oder das Ganze einfach mal mit "sh -x ..." aufrufst. Ich vermute - wie Headcrash - auch eher einen Fehler in den Daten, die an bc gehen, als einen Bug oder eine derartige Einschränkung in bc.

    Gruss, A.
     
  5. #4 theborg, 16.09.2010
    Zuletzt bearbeitet: 16.09.2010
    theborg

    theborg KBitdefender Programierer

    Dabei seit:
    06.08.2004
    Beiträge:
    688
    Zustimmungen:
    0
    Ort:
    Hamburg
    Hm scheinbar nicht wie oben headcrash geschrieben hat geht es.

    sh -x sacht folgendes sieht eigentlich ok aus (Variante 2)

    EDIT: Hi hab den Fehler scheinbar gefunden es liegt an der groß und Kleinschreibung nur wie passe ich das jetzt an ?

     
  6. #5 HeadCrash, 16.09.2010
    HeadCrash

    HeadCrash Routinier

    Dabei seit:
    16.05.2009
    Beiträge:
    482
    Zustimmungen:
    1
    Ort:
    Bayern
    Abend,

    awk kennt die Funktion "toupper"
    Code:
    $ echo "hallo234 du" | awk '{ print(toupper($1),$2) }';
    HALLO234 du
    
    mfg
    HeadCrash
     
  7. #6 saeckereier, 16.09.2010
    saeckereier

    saeckereier Graue Eminenz

    Dabei seit:
    08.05.2005
    Beiträge:
    1.920
    Zustimmungen:
    0
    Ort:
    Im schönen Norden
    Warum immer awk nehmen, wenns doch genau das richtige Tool dafür gibt :-) aus der Manpage von tr:

    A common use of `tr' is to convert lowercase characters to uppercase. This can be done in many ways. Here are three of them:
    Code:
    tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ [FONT=monospace]
    t[/FONT]r a-z A-Z
     tr '[:lower:]' '[:upper:]'
    
     
  8. #7 HeadCrash, 16.09.2010
    HeadCrash

    HeadCrash Routinier

    Dabei seit:
    16.05.2009
    Beiträge:
    482
    Zustimmungen:
    1
    Ort:
    Bayern
    Warum nicht wenn im Skript die Ausgabe der Sensoren eh schon mit awk herausgefiltert wird.

    :) aber man lernt ja nicht aus.
     
  9. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  10. #8 saeckereier, 17.09.2010
    saeckereier

    saeckereier Graue Eminenz

    Dabei seit:
    08.05.2005
    Beiträge:
    1.920
    Zustimmungen:
    0
    Ort:
    Im schönen Norden
    Genau deswegen poste ich das ja. AWK ist natürlich genau so gut, aber es gibt halt eine Reihe kleiner, praktischer Tools, die ich immer mal wieder gern erwähne. (Bzw. ab und zu lerne ich auch welche, die ich bis dato noch nicht kannte.)
     
  11. #9 floyd62, 17.09.2010
    floyd62

    floyd62 Routinier

    Dabei seit:
    01.05.2007
    Beiträge:
    309
    Zustimmungen:
    0
    Stimme zu: immer wieder nett, kleine, praktische Tools kennenzulernen, und zu was nützlichem zu kombinieren. Bin allerdings durchaus der Meinung, dass es auch Sinn macht, Funktionen von mächtigeren Tools wie akw zu kennen und dann auch zu nutzen.

    Wennn ich die ursprüngliche Variante 2 richtig interpretiere, geht es dabei darum, mit 2 Aufrufen von "i2cget" je einen 16-Bit-Wert zu erhalten, und die beiden dann in einem 32-Bit-Wert zusammenzufassen (Das erste Ergebnis liefert die most, das zweite die least significant bits.) Dann lässt sich das evtl. einfach innerhalb eines einzigen awk-Aufrufs etwa so erledigen:

    Code:
    (
            i2cget -y s3c2410-i2c 0x38 0x07 w
            i2cget -y s3c2410-i2c 0x38 0x06 w
    ) |
    awk --non-decimal-data '
                    { sum = lshift(sum, 16) + $0; }
            END     { printf "0x%x %d\n", sum, sum; }
    '
    
    Das sollte den kombinierten Wert in Hex und Dec ausgeben.

    ;) Gruss, A.
     
Thema:

HEX -> DEX mit BC nur bis 16bit ?

Die Seite wird geladen...

HEX -> DEX mit BC nur bis 16bit ? - Ähnliche Themen

  1. 16bit-Wavedatei als Hilfestellung für Zufallszahlen

    16bit-Wavedatei als Hilfestellung für Zufallszahlen: Hallo, kennt einer ein Programm, welches man nutzen kann um aus einer Wave-Datei byte-weise etwas herauszulesen? Habe das im Video...
  2. Linux für nen 16bit Prozessor ?

    Linux für nen 16bit Prozessor ?: Hi ich suche nen sehr alten linux kernel b.z.w. bootdisk für nen 16bit prozi hab schon uhralte dist. von suse und rh ausprobirt aber die laufen...
  3. 16bit Desktop für Halflife

    16bit Desktop für Halflife: Hallo! Hab mich zum ersten mal an WinE herangewagt, selber kompiliert und installiert, Halflife installiert und gepatcht. Beim ersten Start hab...