ubuntuusers.de

Ascii zu Binärcode

Status: Ungelöst | Ubuntu-Version: Kein Ubuntu
Antworten |

leon-20v

Anmeldungsdatum:
13. Februar 2013

Beiträge: 17

Hallo zusammen,

ich muss in ein EEPROM schreiben, das funktioniert hiermit ganz gut:

1
2

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:

1
2
3
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.

1
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

Avatar von 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

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17599

Wohnort: Berlin

Wieso benutzt Du ' wenn Du keine haben willst?

1
2
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

Avatar von 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

Avatar von snafu1

Anmeldungsdatum:
5. September 2007

Beiträge: 2133

Wohnort: Gelsenkirchen

1
2
read eingabe
printf "%.2x" $eingabe

Oder habe ich die Aufgabenstellung missverstanden?

leon-20v

(Themenstarter)

Anmeldungsdatum:
13. Februar 2013

Beiträge: 17

1
2
3
4
5
6
7
8
9

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

Avatar von 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

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17599

Wohnort: Berlin

1
2
3
4
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

Avatar von 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

Antworten |