Benötige Hilfe bei Umrechnung von einer Bitmaske

Sascha_77

Sascha_77

Aktives Mitglied
Thread Starter
Dabei seit
23.10.2005
Beiträge
763
Reaktionspunkte
98
Hallo Leute.

Ich habe hier derzeit ein kleines Problem. Ich habe einen Wert aus einer Bitmaske den ich in Dezimal umrechnen will. Das Ergebnis eines bestimmten Shellbefehls (nvram) schaut z.b. so aus:

g%00%00%00

und wird mit der ersten Zeile im unteren Bashscript auf "g" reduziert.

Als Ergebnis des Scripts erhalte ich die Zahl "103". Was auch korrekt ist.

Code:
csr=`nvram -p 2> /dev/null |grep "csr-" | cut -c 19`
c_csr2=`echo -n $csr 2> /dev/null | perl -pe 's/(.)/sprintf("%x", ord($1))/eg'`
c_csr=`echo $((16#$c_csr2))`
echo $c_csr


Dies funktioniert ebenfalls für diese Werte:

w%00%00%00
P%00%00%00
0%00%00%00

Nun habe ich aber noch Werte die am Anfang anders aussehen. Z.b so:

%14%00%00%00
oder
%10%00%00%00

Dies funktioniert mit obigem Script aber nicht. Wie kann ich diese Art von Werten in eine Dezimalzahl umwandeln?
 
Hast Du eine Beschreibung, warum das Skript die Zahlen so interpretiert und wofür das gut ist? Mir erscheint das ziemlich beliebig. Ich hab's mal versucht nachzuvollziehen:

1.) nvram liefert den Buchstabe g (Prozentzeichen mit Zahlen werden abgeschnitten/verworfen)
2.) g ist das Zeichen Nummer 103 (dezimal) in der ASCII table
3.) und per Perl wird's in HEX umgewandelt, das ergibt 67
4.) am Ende darf die Shell die 67 (HEX) wieder in 103 dezimal umrechnen und ausgeben

Sieht aus als wüsste der Skriptschreiber nicht so recht, was er tut.
Wenn ich mir den Rest der Ausgabe von nvram anschaue, scheinen die Zahlen zwischen den Prozenten HEX zu sein ...und das kann dir jeder Informatiker auswendig übersetzen:

14 (HEX) = 20 (dezimal)
10 (HEX) = 16 (dezimal)
00 (HEX) = 0 (dezimal)

Viel Spaß mit diesem Ergebnis. :D
 
Naja eigentlich weiss der Scriptschreiber das schon. Das ist ein Schnipsel aus einem größeren Script. Im ürbigen habe ich schon so einige Bashscripte gebaut. ;) Bei dieser Umrechung hängts grad halt ein wenig. Das 14 in Dezimal 20 sind ist mir auch klar. Es ging sich nur um das Prozentzeichen vor der Zahl. Aber das habe ich zwischenzeitlich mit Cut (via If-Abfrage ... weil es gibt ja auch Werte ohne das % davor) entfernt gehabt und dann gings. Allerdings habe ich jetzt eine noch viel bessere Lösung gefunden bzw. wurde mir vorgeschlagen:

Code:
csr=$( nvram -p 2> /dev/null | grep "csr-" | cut -c 19-21 )
c_csr=$( perl -e "use URI::Escape; print(ord(uri_unescape(\"$csr\")).\"\n\")" )

2 Zeilen und fertig ists. Kein If kein garnix. :D
 
Zurück
Oben Unten