HEX -> DEX mit BC nur bis 16bit ?

theborg

theborg

KBitdefender Programierer
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
 
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
 
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.
 
Hm scheinbar nicht wie oben headcrash geschrieben hat geht es.

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

localhost scrips # sh -x test.sh
++ i2cget -y s3c2410-i2c 0x38 0x07 w
++ awk -F 0x '{print $2}'
+ ZMSB=00c5
++ i2cget -y s3c2410-i2c 0x38 0x06 w
++ awk -F 0x '{print $2}'
+ ZLSB=c581
+ echo 00c5
00c5
+ echo c581
c581
+ echo 00c5c581
00c5c581
++ bc
++ echo 'ibase=16; 00c5c581'
(standard_in) 1: syntax error
+ Z=
+ echo

localhost scrips # echo "ibase=16; 00c5c581" | bc
(standard_in) 1: syntax error
localhost scrips # echo "ibase=16; c5c581" | bc
0
localhost scrips # echo "ibase=16; c581" | bc
0
localhost scrips # echo "ibase=16; 81" | bc
129

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

localhost scrips # echo "ibase=16; 00C5C581" | bc
12961153
 
Zuletzt bearbeitet:
Abend,

awk kennt die Funktion "toupper"
Code:
$ echo "hallo234 du" | awk '{ print(toupper($1),$2) }';
HALLO234 du
mfg
HeadCrash
 
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:]'
 
Warum nicht wenn im Skript die Ausgabe der Sensoren eh schon mit awk herausgefiltert wird.

:) aber man lernt ja nicht aus.
 
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.)
 
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.
 

Ähnliche Themen

Problem mit HSPA+ Modem Huawei E353 - Installation unmöglich?

Variabeln aus Bashscript in rrdtool parameter übernehmen.

Shell if-Abfrage mit equal or greater wirft Fehlermeldung unary operator expected

Displayport + externer Monitor zeigt bei startx nichts erst bei DVI

sed im script per crontab

Zurück
Oben