leon-20v
Anmeldungsdatum: 13. Februar 2013
Beiträge: 17
|
Hallo zusammen, ich muss in ein EEPROM schreiben, das funktioniert hiermit ganz gut:
|
printf '\x0D' | dd of=eeprom bs=1 seek=2064 count=1
|
Ich schreibe hiermti an die Adresse 0x800 im EEPROM die 0D.
Ich habe für diese Information nur 1 Byte. Ich möchte jetzt aber den Benutzer die Zahl 13 eingeben lassen. Das funktioniert so leider nicht: | read value
printf "'%02X\n'",$value | dd of=eeprom bs=1 seek=2064 count=1
|
Hier nimmt er mir das ' als erstes zeichen. Das hab ich auch schon probiert, ich habe eigentlich alles versucht, ich komm einfach nicht auf die Lösung.
| printf $value | dd of=eeprom bs=1 seek=2064 count=1
|
Am Ende sollte wirklich "0d" drinn stehen wenn Value den Wert 13 hat. Vielen Dank.
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Hi leon, erstmal willkommen hier auf dem Forum ! Verstehe ich das richtig, dass Du die (ASCII-) Eingabe "13" in ein Binärbyte \x0d umwandeln willst ? (also nicht die Zeichenfolge "0d" !) Das geht am sichersten mit xxd -r, wie Du hier siehst: echo 0x13 | xxd -r | hd LG, track
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17599
Wohnort: Berlin
|
Wieso benutzt Du ' wenn Du keine haben willst? | printf "'%02X\n'",$value | dd of=eeprom bs=1 seek=2064 count=1
printf "%02X\n" $value | dd of=eeprom bs=1 seek=2064 count=1
|
Das Komma scheint mir auch falsch.
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Gerade habe ich es nochmal probiert; auf deinem Wege würde es auch gehen, nur mit Shell-Mitteln: track@lucid:~$ z=13
track@lucid:~$ printf "\x$z" | hd
00000000 13 |.| Dein zweiter Versuch (printf "'%02X\n'",$value ) würde in der anderen Richtung umwandeln: von binär nach Hex, aber das willst Du wohl nicht. LG, track
|
leon-20v
(Themenstarter)
Anmeldungsdatum: 13. Februar 2013
Beiträge: 17
|
danke für eure antworten. track warum 13? ich will 0d in der tabelle haben. ich habs immer noch nicht raus, das beschäftigt mich jetzt schon 5h ☹
|
theinlein
Anmeldungsdatum: 29. Dezember 2007
Beiträge: 1279
|
Hi, das was track gezeigt hat, nimmt einen String, interpretiert diesen im Sinne eines Hex-Wertes und schreibt es binär. Was nun fehlt, ist die Umsetzung des Eingegebenen von Dezimal in Hex. read myDecimal
z=$(printf "%02x$myDecimal")
... muss zuvor gemacht werden, bevor es an das zuvor gezeigt übergeben wird.
|
leon-20v
(Themenstarter)
Anmeldungsdatum: 13. Februar 2013
Beiträge: 17
|
Das ist genau die Lösung die ich gesucht habe!! Vielen DANK Jetzt muss ich es nur noch verstehen. Mit diesen Konvertierungssachen hatte ich schon im Studium immer Probleme und habe es immer weggeschoben.
|
snafu1
Anmeldungsdatum: 5. September 2007
Beiträge: 2133
Wohnort: Gelsenkirchen
|
| read eingabe
printf "%.2x" $eingabe
|
Oder habe ich die Aufgabenstellung missverstanden?
|
leon-20v
(Themenstarter)
Anmeldungsdatum: 13. Februar 2013
Beiträge: 17
|
|
read value
decimal=`expr $value - 2000`
hexadecimal=`printf "%x" "$decimal"`
printf "\x$hexadecimal" | dd of=eeprom bs=1 seek=1 count=1
|
So schreibt er mir '0d' in mein eeprom. –> PERFEKT!!! Kann mir evtl. noch jemand helfen und mir sagen wie ich das wieder auslesen kann? Also die Stelle von seek in der Datei und evtl. umkodiere? Was muss ich denn bei Strings beachten? Jetzt nimmt er enfach den HEX wert der ASCI dabelle und schreibt den rein.
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
leon-20v schrieb: Jetzt muss ich es nur noch verstehen. Mit diesen Konvertierungssachen hatte ich schon im Studium immer Probleme und habe es immer weggeschoben.
Ein guter Weg, um da leichter durchzublicken ist, jeden Schritt mal mit hd anzuzeigen. Dann siehst Du nämlich sowohl die binäre als auch die ASCII- Darstellung: track@lucid:~$ n=13
track@lucid:~$ echo $n | hd
00000000 31 33 0a |13.|
track@lucid:~$ z=$(printf %02x $in)
track@lucid:~$ echo $z | hd
00000000 30 64 0a |0d.|
track@lucid:~$ printf "\x$z" | hd
00000000 0d |.|
leon-20v schrieb: Kann mir evtl. noch jemand helfen und mir sagen wie ich das wieder auslesen kann? Also die Stelle von seek in der Datei und evtl. umkodiere?
Auch der Weg zurück führt am einfachsten über xxd: track@lucid:~$ printf "\x$z" | xxd -i
0x0d LG, track
|
theinlein
Anmeldungsdatum: 29. Dezember 2007
Beiträge: 1279
|
leon-20v schrieb: Jetzt muss ich es nur noch verstehen.
"\x.."
bedeutet, dass in den String (in Gänsefüßchen) ein Sonderzeichen eingefügt wird, das textuell beschrieben wird, nämlich durch die Zeichenfolge nach dem Bäcksläsch-x. Mit
"\x0d"
wird also EIN BYTE in den String eingefügt, das den Hex-Wert 0d hat. Diese Schreibweise hat nichts speziell mit printf zu tun. Das ist Notation von Strings / Literale. Das andere ist eine Formatumwandlung, die an printf in Auftrag gegeben wird. printf "%02x" Wert
heißt, dass ein 'Wert' Hexadezimal auf 2 Stellen mit führender Null geschrieben werden soll (%02x). Das Ergebnis ist also ein Text in bestimmter Schreibweise.
|
leon-20v
(Themenstarter)
Anmeldungsdatum: 13. Februar 2013
Beiträge: 17
|
Vielen Dank für eure Antworten. Sehr nett dass ihr mir das so erklärt ☺ Ich denke ich habe dass jetzt eigentlich verstanden, aber irgendwie kann ich es immer noch nicht auf andere Probleme anwenden. Ich habe jetzt in einer Datei 6Byte Platz und möchte hier eine MAC Adresse speichern. Wie mach ich denn jetzt, dass wenn der Benutzer 0A:BF:FF:FF:FF:FF als MAC-Adresse eingibt, auch 0A geschrieben wird? Vielen Dank für eure Hilfe ☺
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17599
Wohnort: Berlin
|
| for byte in $(echo "0A:BF:FF:FF:FF:FF" | sed 's/:/ /g')
do
echo -en '\u0'$byte
done > binaeres
|
|
leon-20v
(Themenstarter)
Anmeldungsdatum: 13. Februar 2013
Beiträge: 17
|
Danke für deine Antwort, ich habs so gelöst: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 |
read value
value2070=${value:0:2}
value2071=${value:3:2}
value2072=${value:6:2}
value2073=${value:9:2}
value2074=${value:12:2}
value2075=${value:15:2}
printf "\x$value2070" | dd of=eeprom bs=1 seek=2070 count=1
printf "\x$value2071" | dd of=eeprom bs=1 seek=2071 count=1
printf "\x$value2072" | dd of=eeprom bs=1 seek=2072 count=1
printf "\x$value2073" | dd of=eeprom bs=1 seek=2073 count=1
printf "\x$value2074" | dd of=eeprom bs=1 seek=2074 count=1
printf "\x$value2075" | dd of=eeprom bs=1 seek=2075 count=1
|
Es stehen mal die Werte die ich eingebe im eeprom, somit sollte es passen, hoffe ich jetzt mal. ☺
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Das geht aber auch in einem Rutsch, dann ist es übersichtlicher. Man nehme einfach eine Parameter Expansion: track@lucid:~$ mac="0A:BF:FF:FF:FF:FF"
track@lucid:~$ echo "$mac"
0A:BF:FF:FF:FF:FF
track@lucid:~$ echo "\x${mac//:/\x}"
\x0A\xBF\xFF\xFF\xFF\xFF
track@lucid:~$ macbin="$( printf "\x${mac//:/\x}" )"
track@lucid:~$ printf "$macbin" | hd
00000000 0a bf ff ff ff ff |......| Aufpassen musst Du nur, wenn eine "00" in der Adresse vorkommt, denn der Binärwert \x00 lässt sich nicht in einer Variablen speichern ! (direkte Ausgabe geht sehr wohl. also sowas: printf "\x${mac//:/\x}" | dd of=eeprom bs=6 seek=2070 count=1 !) LG, track
|