Zeichenkonvertierung auf der Konsole

Post Reply
Message
Author
Frank

Zeichenkonvertierung auf der Konsole

#1 Post by Frank »

Moin Mädels,

ich "spiele" mal gerade mit meinen /proc-Ausgaben.
Z.B. erzeugt ein <b>cat /proc/ide/ide1/hdc/identify</b> eine Liste von Hexbytes:
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">8580 0000 0000 0000 0000 0000 0000 0000
0000 0000 2020 2020 2020 2020 2020 2020
2020 2020 2020 2020 0000 0000 0000 312e
3035 2020 2020 5f4e 4543 2044 5644 5f52
5720 4e44 2d31 3330 3041 2020 2020 2020
2020 2020 2020 2020 2020 2020 2020 0000
0000 0b00 0000 0200 0200 0006 0000 0000
0000 0000 0000 0000 0000 0000 0000 0007
0003 0078 0078 0078 0078 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0407 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
...</font><hr></pre></blockquote>
Das scheint ganz popliger ASCII-Text zu sein, nur wie bekomme ich den unter Linux raus?
Die Tools hexdump und od sind mir bekannt, aber die können IMHO keine 2-Byte-Hexzahlen in ASCII wandeln, oder?
Gibt's dafür entsprechende Tools?

Danke
Frank

pab

Re: Zeichenkonvertierung auf der Konsole

#2 Post by pab »

2-byte hex?

glaubst du ernsthaft, dass es sich dabei um utf16 text handelt? ;)


perldoc Unicode::String

Frank

Re: Zeichenkonvertierung auf der Konsole

#3 Post by Frank »

Klar sind das 2-Byte-Hexcodes von ASCII-Zeichen, zumindest die, die einem sofort als solche ins Auge springen:
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">8580 0000 0000 0000 0000 0000 0000 0000
0000 0000 <font color="FF0000">2020 2020 2020 2020 2020 2020
2020 2020 2020 2020 0000 0000 0000 312e</font><!--color-->
<font color="0000FF"> 1 .</font><!--color-->
<font color="FF0000">3035 2020 2020 5f4e 4543 2044 5644 5f52</font><!--color-->
<font color="0000FF">0 5 _ N E C D V D _ R</font><!--color-->
<font color="FF0000">5720 4e44 2d31 3330 3041 2020 2020 2020</font><!--color-->
<font color="0000FF">W N D - 1 3 0 0 A</font><!--color-->
<font color="FF0000">2020 2020 2020 2020 2020 2020 2020</font><!--color--> 0000

0000 0b00 0000 0200 0200 0006 0000 0000
0000 0000 0000 0000 0000 0000 0000 0007
0003 0078 0078 0078 0078 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0407 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
...
</font><hr></pre></blockquote>

Die "20" sind Leerzeichen und daher nicht darstellbar.
Und wie du siehst ist das hier schlicht und einfach die Gerätemeldung meines DVD-Brenners mitsamt Bios-Version.

Aber die ursprüngliche Frage bleibt: gibt es ein Tool, welches solche Ausgaben eben konvertiert?

thx

Michael

Re: Zeichenkonvertierung auf der Konsole

#4 Post by Michael »

man recode ?

Cheers

Michael

Jochen

Re: Zeichenkonvertierung auf der Konsole

#5 Post by Jochen »

recode fand ich als Lösungsansatz interessant, hat mich aber nicht weitergebracht. Statt dessen habe ich ein wenig awk gehackt:<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">#!/bin/awk -f

function isprint(c) {
if ((c > 31 && c < 127))
return 1
return 0
}

{
zk =""
for (i = 1; i <= NF ; i++) {
byte1=strtonum ("0x" substr ($i,1,2))
if (isprint(byte1))
zeichen1=sprintf("%c",byte1)
else
zeichen1="."
byte2=strtonum ("0x" substr ($i,3,2))
if (isprint(byte2))
zeichen2=sprintf("%c",byte2)
else
zeichen2="."
zk = zk zeichen2 zeichen1
}
print $0 "\t" zk
}

</font><hr></pre></blockquote>Das wäre mit perl und unpack ggf. ein Einzeiler gewesen - na ja, vielleicht postet's ja einer, der unpack besser beherrscht als ich... Man beachte, dass in der Ausgabe die 2 Bytes pro Hexwert verdreht werden müssen, da die Daten Big-Endian sind. Beim Aufruf einfach die Datei als Argument übergeben, also "hex2str /proc/sys/ide/ide1/hdc/identify".

Jochen

Post Reply