Schrift
[thread]9050[/thread]

Binärdaten auslesen / umwandeln

Leser: 2


<< >> 5 Einträge, 1 Seite
Norden
 2007-05-30 20:25
#77075 #77075
User since
2007-05-30
12 Artikel
BenutzerIn
[default_avatar]
Hallo Leute,
hab ein für mich großes Problem das ich einfach nicht geknackt kriege. Ich muss Dateien auslesen, die einen Header im ASCII Format haben. Hier zunächst ein Auszug aus einem Header:

a0751417.443722
XXXXXX 14/05/2007 17:43:31 14/05/2007 17:44:37 0380 00XX,0 00XX,X 00
0000000 0030 0002000 0030 12
1 0 2 08192 1 0290 7.50 01064.o 0 0 00 000 12 002000 0.500 BT0
1 1 2 08192 1 0290 7.50 01064.o 0 0 00 000 00 002000 3.9683 BC0
1 0 2 08192 1 0800 7.50 00532.p 0 0 00 000 12 002000 0.500 BT1
1 1 2 08192 1 0800 7.50 00532.p 0 0 00 000 00 002000 3.1746 BC1
........................

Auf den Header folgen dann 32 bit Integer Daten, die durch CRLF getrennt sind. Aus dem Beispiel-Header geht hervor, dass es 12 DataSets sind, und zu jedem DataSet gibt es 8192 Werte. Dies müsste nach erfolgreicher Konvertierung in etwa so aussehen:

1064.000 .o analog 0 1064.000 .o photon 0 .......
2,4552 20,3400 ......
2,3475 50,6000 ......
4,4104 29,0100 ......
12,2865 28,3000 ......
.......... .......... ......

Mein Problem ist nun, dass ich überhaupt nicht weiß, wie ich an diese vielen Werte herankommmen soll. Ich spiele seit Tagen mit printf, read, pack, unpack herum, und komme zu keinen vernünftigen Ergebnissen. Ich wäre riesig dankbar, wenn mir hier jemand mit ein bisschen Quellcode und / oder guten Ideen weiterhelfen könnte!
Also schon mal vielen Dank vorab
renee
 2007-05-30 21:03
#77076 #77076
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Es wäre praktisch, wenn Du hier skizzieren würdest, was am Ende rauskommen soll!
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Norden
 2007-05-30 23:05
#77077 #77077
User since
2007-05-30
12 Artikel
BenutzerIn
[default_avatar]
Hallo Renee,
rauskommen soll am Ende so etwas:

1064.000 .o analog 0 1064.000 .o photon 0 .......
2,4552 20,3400 ......
2,3475 50,6000 ......
4,4104 29,0100 ......
12,2865 28,3000 ......
.......... .......... ......

Wie komme ich an solche Werte wie 2,4552? Im Header stehen die Anzahl der DataSets, in diesem Fall 12, am Ende muss ich also 12 Spalten haben, und in jeder Spalte müssten 8192 Werte stehen (verrät ebenfalls der Header).

Wie komme ich an diese Werte?? Es handelt sich dabei um 32 bit integer, die wie gesagt durch crlf getrennt sind.

Ich öffne die Datei im Binmode, lese zeilenweise ein bis die Binärdaten anfangen. Und dann? Wie muss ich die Daten umwandeln? Pack, unpack, printf? Ich bekomme es einfach nicht hin...
docsnyder
 2007-05-31 17:50
#77078 #77078
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
@Norden

Du solltest herausbekommen, "wie" die 4-Byte Integer Werte abgelegt sind (LSB oder MSB?). Erst mit dieser Info kannst Du die Daten interpretieren.

Gruß, Doc
Norden
 2007-05-31 21:20
#77079 #77079
User since
2007-05-30
12 Artikel
BenutzerIn
[default_avatar]
Aaaaalso, ich war in der Zwischenzeit ein bisschen erfolgreich.
Ich habe folgendes herausgefunden:

Code: (dl )
1
2
3
4
5
6
7
8
9
do
{
$line = <FILE>;
$zeile = $zeile+1;
print unpack("I", substr($line,0,3)) *$MultFact[$zeile], "\n";
print unpack("I", substr($line,4,7)) *$MultFact[$zeile], "\n";
print unpack("I", substr($line,8,11)) *$MultFact[$zeile], "\n";
............
}until $zeile == 12 || eof;


So bekomme ich zum Teil die richtigen Werte. Das ich die Int-Werte noch mit einem bestimmten Faktor multiplizieren musste, war mir nicht bekannt.
Aber nichts desto trotz habe ich anscheinend ein Problem mit big-endian und little endian. Die Daten sind big-endian, wie kann ich die denn in little-endian konvertieren?
<< >> 5 Einträge, 1 Seite



View all threads created 2007-05-30 20:25.