Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]6438[/thread]

binäre Daten: binäre Daten zeitoptimal einlesen



<< |< 1 2 >| >> 11 Einträge, 2 Seiten
rookie
 2004-07-28 15:27
#85045 #85045
User since
2004-07-28
9 Artikel
BenutzerIn
[default_avatar]
ich möchte binäre Daten aus einem file einlesen und tue dies über byteanzahl adressiert mit dem Befehl "read" - kann ich mein Programm durch optimierung meines Codes/ andere Verwendung von Befehlen beschleunigen??

vielen dank für eure Hilfe


mfg Roger
sri
 2004-07-28 15:43
#85046 #85046
User since
2004-01-29
828 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ähm, wo ist der Code zum optimieren?
Ronnie
 2004-07-28 15:45
#85047 #85047
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Das ist schwer zu sagen ohne es zu sehen.
Ishka
 2004-07-28 16:27
#85048 #85048
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Kommt drauf an, was du genau machen willst. Wenn du alle Daten brauchst, dann gibts nichts außer allen einzulesen. Wenn du nur bestimmte Daten haben willst (zB. Byte Nr. 4321 und Byte Nr. 47328), dann kann man tatsächlich was machen -- sllerdings schau ich erst nach, wenn ich weiß, daß du das brauchst, weil ich sonst zu faul für bin ;)
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
rookie
 2004-07-28 17:19
#85049 #85049
User since
2004-07-28
9 Artikel
BenutzerIn
[default_avatar]
meine einleseroutine schaut wie folgt aus:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
sub read_in
{
my ($botschaft_bin, $botschaft_hex);
open (FILE, "CCO_Quelldatei/Trigger/RC0.CCO");
binmode (FILE);

seek (FILE, 1024, 0);

until (substr($botschaft_hex,0,10) =~ m/f{10,}/ && $botschaft_hex !~ /f{32,}/)
{
######################################################################
read (FILE, $botschaft_bin, 16);
$botschaft_hex = unpack ("H32", $botschaft_bin);

######################################################################

push (@botschaften_gesamt, $botschaft_hex);
}

close (FILE);

return (\@botschaften_gesamt);
}

dabei soll die gesamte binäre Datei eingelesen werden und zwar alle 16 Byte als ein string eines array-elementes

danke für eure schnellen antworten - echt super:D

format_c: Boardtags spendiert\n\n

<!--EDIT|format_c|1091037192-->
Ronnie
 2004-07-28 21:49
#85050 #85050
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Da bis jetzt keiner geantwortet hat, melde ich mich mal zu Wort. Dein Code erscheint richtig und ich wüsste nicht wo ein Performance-Problem sein sollte. Vieleicht ist es einfacher das ganze File in ein Array zu slurpen und dann die interessanten Inhalte zu greppen. Hängt von der Dateigröße ab. Mit Tie::File kannst du eine Datei auch direkt als Array ansprechen, was bei größeren Dateien aus Speichergründen interessant ist.
format_c
 2004-07-28 21:55
#85051 #85051
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Wüsste auch nicht wie man da noch was optimieren soll. tust ja schon auf die interesssante Stelle seek'en

Gruß Alex
Dubu
 2004-07-29 01:30
#85052 #85052
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
[quote=rookie,28.07.2004, 15:19]
Code: (dl )
1
2
    until (substr($botschaft_hex,0,10) =~ m/f{10,}/ && $botschaft_hex !~ /f{32,}/)
  {
[/quote]
Die Regex fuer die Hexdarstellung kommt mir etwas umstaendlich vor. Schliesslich kann Perl genauso mit Binaerdaten vergleichen, und Regexen braucht man hier auch nicht.
Code: (dl )
1
2
3
4
    my $botschaft_bin = "\x00" x 16;
   until (substr($botschaft_bin,0,10) eq "\xFF" x 10 && $botschaft_bin ne "\xFF" x 16)
  {
  ...

Die Hexdarstellung scheinst du ja wohl im Hauptprogramm zu brauchen, sonst wuerde ich die Umwandlung ganz herauswerfen. ;)
rookie
 2004-07-29 12:28
#85053 #85053
User since
2004-07-28
9 Artikel
BenutzerIn
[default_avatar]
1. habe leider keinen Befehl ähnlich "slurp" gefunden - was meinst Du damit?
2. Tie::File kann man soweit ich weiss nur auf ascii files nutzen - Zeilenendeerkennung wird genutzt - oder?
3.danke für die Vereinfachung in der Schleifenbedingung - mit regexen meinst du reguläre ausdrücke oder?
4.die zeile <<<my $botschaft_bin = "\x00">>> versteh ich noch nicht ganz --- aber du hast recht, die hex wandlung könnt ich so auch rausnehmen =) danke
Relais
 2004-07-29 13:23
#85054 #85054
User since
2003-08-06
2246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=rookie,29.07.2004, 10:28]1. habe leider keinen Befehl ähnlich "slurp" gefunden - was meinst Du damit?[/quote]
Code: (dl )
1
2
3
open ( DATEI, "< $dateiname" ) # siehe perldoc perlintro
or die qq(Konnte Datei "$dateiname" nicht zum Lesen öffnen: $!);
my @zeilen_array = <DATEI>; # Array enthält nun alle "Zeilen" aus der Datei. Nicht so superschlau bei Binärdateien.

perlintro

"Slurp-Beispiel" mit Modul
Code: (dl )
1
2
3
use Slurp; # Slurpt ganze Dateien in Variablen
my $inhalt = slurp( $dateiname )
or die qq(Konnte Datei "$dateiname" nicht einlesen:$!));


"Slurp-Beispiel klassisch"
Code: (dl )
1
2
3
4
5
{ # Öffnet einen Block, in dem...
local $/ = undef; # ...das "Zeilenende" ausgeschaltet wird.
open ( DATEI, "< $dateiname" ) # siehe perldoc perlintro
or die qq(Konnte Datei "$dateiname" nicht zum Lesen öffnen: $!);
my $inhalt = <DATEI>; # Scalar enthält nun allen Inhalt der Datei.

Quote
2. Tie::File kann man soweit ich weiss nur auf ascii files nutzen - Zeilenendeerkennung wird genutzt - oder?

Mit Ascii irrst Du möglicherweise ein kleines bißchen, "Zeilenendeerkennung" stimmt so halbwegs, aber was das Zeilenende sein soll, ist Dein Bier, siehe Tie::File - Einfach, oder etwa nicht? - Das heißt, wenn Du einen sinnvollen Trenner wüßtest, ginge es vielleicht doch. Sonst nicht.
Quote
3. ... mit regexen meinst du reguläre ausdrücke oder?

"Perl reguläre Ausdrücke"... ;-)
Erst denken, dann posten --
27. Deutscher Perl- u. Raku -Workshop (Termin wird noch gesucht) 2025 in München.

Winter is Coming
<< |< 1 2 >| >> 11 Einträge, 2 Seiten



View all threads created 2004-07-28 15:27.