PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : binaere Datei mit perl auslesen ???



tomes
07-12-2002, 13:52
Ich muesste ein binaere Datei auslesen und zwar ein bestimmte Stelle in dieser.
Hat jemand schon so etwas gemacht ?
Muss perl sein, da Plattform unabaengig.

T;o)Mes

Sion
07-12-2002, 14:26
Original geschrieben von tomes
Ich muesste ein binaere Datei auslesen und zwar ein bestimmte Stelle in dieser.
Hat jemand schon so etwas gemacht ?
Muss perl sein, da Plattform unabaengig.

T;o)Mes

Folgendes Programm ließt eine wav-datei ein und kopiert diese ohne wav-header. Das sollte weiterhelfen. Wenn du mir genauer sagst was du brauchst, kann ich besser helfen!



#!/usr/bin/perl

$bufsize = 1024*1024;

open(FHIN, "<000_000_100.wav") or die "Can't open input file!";
open FHOUT, ">>/tmp/append_test/tempfile.raw" or die "Can't open output file!";
binmode FHIN, ":raw";
binmode FHOUT, ":raw";
seek FHIN, 44, 0;
while (read FHIN, $buf, $bufsize)
{
print FHOUT $buf;
}
close FHIN;
close FHOUT;

tomes
07-12-2002, 16:08
eine bestimmte binaere Datei auslesen ;)
In dieser Datei steht an einer bestimmten Stelle ( zwei Stellen) ein Zahl.
Diese Stellen liegen genau 63 bzw 65 Zeichen nach einer Konstanten Zeichenkette.
Also die Datei aendert sich immer wieder mal und damit diese Zahlen. Konstant bleibt die Zeichenkette und die Anzahl der Stellen zu den Zahlen. Diese brauche ich.
Wenn ich versuche die File auszulesen bekomme ich nur irgendwelche Wirwar.
Da ich auch nicht die Struktur kenne, nutzt mir ein fprint usw. auch nichts :(

T;o)Mes

Badsteve
07-12-2002, 17:00
so vielleicht ?

#!/usr/bin/perl -w

use strict;
use warnings;
use POSIX;

my $buffer=0;
open(FH, "< 1.mp3") or die "Fehler";

seek( FH, 66, SEEK_SET);
read(FH,$buffer,10);
print $buffer, "\n";
close(FH);


66 ist das erste Zeichen was eingelesen wird und von dort aus sind es 10!
Naja ist vielleicht nicht das beste aber ich bin am üben! :-)

tomes
07-12-2002, 17:05
aber bedeute nicht die 66 --> das 66zigste Zeichen ?
Ich weiss ja nicht genau an welcher Stelle die Konstante liegt. Ich weiss ja nur das sie da ist und das es von da aus, genau so und so viele Stellen sind.
Also die Konstante koennte an der 100sten oder an der 103ten Stelle stehen.
:(

T;o)Mes

fork
07-12-2002, 17:54
binmode FILEHANDLE;

Das ist in jedem Fall ein entscheidendes Element in deinem Programm.

Dann würde ich nach einem Regex suchen, in etwa so:
$konstante_zeichenkette="blablabla";
open(FH,"<bla.bin");
binmode(FH);

$_=<FH>;
# Das soll die gesamte Datei(die hoffentlich nicht so gross ist) in
# die Variable packen(ungetestet, vielleicht noch $/(Input record separator) vorher löschen),
# pure Faulheit halt

($searchd_value)=/$konstante_zeichenkette.{63}(.{5})/;
# Sucht vorgebene Zeichenkette, ueberspringt 63 beliebige Zeichen und speichert die
# 5 folgenden Zeichen in $1 was im unbenannten Array links dann in $searched_value landet.
soviel zur Theorie...

Gruß Tobias

tomes
07-12-2002, 19:41
Klammer bei ($searchd_value) sein ?
Wenn ich sie weglasse, bekomme ich auf ein print keine Ausgabe.
Wenn ja warum und wie komm ich dann da ran ?

Diese Prinzip Probiere ich auch schon ne ganze Weile, so noch nicht ;) aber so aehnlich.
Die File ist nicht allzulang ;)

T;o)Mes

fork
08-12-2002, 13:59
Ja die Klammern muessen sein, da links ein Array stehen muss, ansonsten wird das resultierende Array($1 - $x des Suchausdrucks) im skalaren Kontext ausgewertet, und muesste der hoechste Index zurückgegeben werden.

Gruß
Tobias

tomes
08-12-2002, 14:37
waehre dann nicht ein @ korrekter
Quatsch, musste jetzt erstmal nachschauen, alles klar, probier ich mal aus, hoffendlich klappt es.

T;o)Mes

tomes
08-12-2002, 17:03
Alles klar scheint soweit zu *funcen*
Zwar ein wenig anders als gedacht, aber was solls.
Der Header sieht wie folgt aus:


Dr.Web version 4.20+ Anti-Virus Database
Copyright (c) by Igor Daniloff, 1998-2002
Created bdðoÇ¢·qÈÝ6iloff, Daniloff's Anti-Virus Labs and DialogueScience Inc.
IDRWc%Ù÷œ b]šÛ"5oj·qAž`Ñ ........

Jetzt muss ich nur noch schauen in welcher Zeile der Suchstring steht ;)
Komisch, ich dachte immer, dass "binaere Dateien" nur aus "einer Zeile" bestehen.


#!/usr/bin/perl -w
#
open(FH, "test.vdb") or die $!;
binmode(FH);
@_=<FH>;
$a=$_[3];
$z=substr($a,63,3);

close(FH);
print $z."\n";


T;o)Mes

fork
08-12-2002, 19:31
$_=<FH>;
Das meinte ich schon so. Denn über ein Array muss wieder eine Schleife drüberlegen. Ein Skalar kann man direkt durchsuchen lassen. Wie gesagt noch INPUT_RECORD_SEPARATOR (=$/) löschen(und vorher sichern und nachher den Wert wiederherstellen) dann wird's alles in einen Skalar eingelesen. Dem RegEx ausdruck muss man dann noch sagen das er CR/LF nicht als Bereichsende ansehen soll. Das muesste dann glaub ich /.../m sein, hab' jetzt aber gerade keine Lust in der Bibel nachzuschau'n.

tomes
09-12-2002, 18:54
Irgenwie hab ich auf der Leitung gesessen ;)
Alles Klar, THX

T;o)Mes