Schrift
[thread]6853[/thread]

Datei Binär auslesen

Leser: 2


<< |< 1 2 >| >> 15 Einträge, 2 Seiten
Froschpopo
 2005-04-06 00:20
#53354 #53354
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
ìch will ein GIF binär einlesen und in dezimal darstellen.
für letzteres habe ich eine Lösung:

Code: (dl )
1
2
3
4
5
sub to_dec {
my $zahl = shift;
$zahl = unpack("N",pack("B32",substr("0"x32 . $zahl,-32)));
return $zahl;
}


Was ich nun brauche ist eine Schleife mit der ich ne binäre Datei "zeilenweise" abarbeiten kann, in etwa so:
Code: (dl )
1
2
3
4
binmode(GIF);
for ( <GIF> ) {
to_dec($_);
}

wie soll das gehen?
dominicn
 2005-04-06 00:25
#53355 #53355
User since
2003-08-08
327 Artikel
BenutzerIn
[default_avatar]
vielleicht mit perls read-funktion? da kannst du eine länge angeben. weiß aber nicht, ob das auch mit binmode so funktioniert und so, habe es noch nie gebraucht.
Froschpopo
 2005-04-06 00:26
#53356 #53356
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
ups stimmt, da hätt ich auch gleich drauf kommen können ! thx
Froschpopo
 2005-04-06 00:32
#53357 #53357
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Ok mit read() hab ich jetzt nen ziemlich üblen Zeichensalat. Was ich aber wollte sind Nullen und Einsen!
sri
 2005-04-06 00:43
#53358 #53358
User since
2004-01-29
828 Artikel
BenutzerIn
[Homepage] [default_avatar]
*lol*

Natuerlich hast du Zeichensalat, es kommt darauf an wie du deine "binaeren" Daten interpretierst!

perldoc -f unpack

mach einfach mal unpack( 'B*', $input ); wenn du einsen und nullen sehen willst. :)

P.S.: Ich bin fuer das Umbenennen des forums in board.froschpopo-community.de\n\n

<!--EDIT|sri|1112734036-->
Froschpopo
 2005-04-06 00:48
#53359 #53359
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
ich bin auch dafür
Dubu
 2005-04-06 15:22
#53360 #53360
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Moment, sehe ich das richtig: Du moechtest erst eine Binaerdatei in eine Folge von ASCII-Nullen und ASCII-Einsen, also eine Art "ASCII-Binaerdarstellung", umwandeln, um sie dann in der Funktion to_dec wieder in Binaerdaten und dann in Dezimalzahlen zu wandeln? Den Sinn musst du mir mal erklaeren.
Froschpopo
 2005-04-06 15:36
#53361 #53361
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
ich will ein Bild in ein Script reinpackenum und es anschließend mit Tk wieder auszulesen. Ich kann ja Photo() auch nen Datenstring übergeben, der jedoch binär sein muss. Da es nur ein Script ist, kann ich in die Textdatei keine binären einträge vornehmen, denn diese würden ja dann beim bearbeiten des Scripts im ASCII-Modus zerstört werden.\n\n

<!--EDIT|Froschpopo|1112787623-->
Taulmarill
 2005-04-06 15:42
#53362 #53362
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
man könnte doch mit read() einfach 4 bytes einlesen und die dann mit unpack "L", $fourBytes; in einen integer wandeln. oder überseh ich jetzt was?
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Dubu
 2005-04-06 16:08
#53363 #53363
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Ah, ich verstehe.
Da wuerde ich aber keine Binaerdarstellung nehmen, sondern Hex, das spart Platz.

Hier mal ein Prograemmchen, dass Binaerdaten in Hexdaten umwandelt oder umgekehrt, je nachdem, unter welchem Name (bin2hex oder hex2bin) man es aufruft:
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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#!/usr/bin/perl
# bin2hex - wandle Binaerdatei in Hexadezimaldarstellung um.
# hex2bin - wandle Hexadezimaldarstellung in Binaerdatei um.
#
# Aufruf: bin2hex binaerdatei hexdatei
# oder    hex2bin hexdatei binaerdatei
#
#
use strict;
use warnings;

die "Aufruf: $0 infile outfile" unless @ARGV == 2;

my ($infile, $outfile) = @ARGV;

die "Eingabe und Ausgabe muessen verschieden sein" unless $infile ne $outfile;

open (my $in, $infile) or die "kann $infile nicht oeffnen: $!";
open (my $out, '>', $outfile) or die "kann $outfile nicht oeffnen: $!";

if ($0 =~ /bin2hex$/) {
   bin2hex($in, $out);
} elsif ($0 =~ /hex2bin$/) {
   hex2bin($in, $out);
} else {
die "Das Programm muss bin2hex oder hex2bin heissen!";
}

close $in;
close $out;

##########

sub bin2hex {
   my ($from, $to) = @_;

   binmode $in;
   $/ = \8;    # immer 8 Bytes einlesen
   while (<$from>) {
       print $to unpack("H*", $_), "\n";
   }
}

sub hex2bin {
   my ($from, $to) = @_;

   binmode $out;
   while (<$from>) {
       chomp;  # Zeilenenden abschneiden
       print $to pack ("H*", $_);
   }
}

Das kannst du sicherlich anpassen.

Edit: Fehlermeldung eingefuegt, wenn das Programm einen falshcen Namen hat. :)\n\n

<!--EDIT|Dubu|1112790688-->
<< |< 1 2 >| >> 15 Einträge, 2 Seiten



View all threads created 2005-04-06 00:20.