Binärfile auslesen

Hallo NGler,

ich hab ein Binärfile bei dem ich gerne ganz simpel und einfach zur
Erkennung des Formats einen Wert auslesen möchte. Leider komme ich auf
die Schnelle nicht drauf, wie ich z.B. den Int32 der sich dort(von Byte
5-8) befindet in einen String wandle.

Ich nutze fopen um die Datei zu öffnen, in etwa so:

$fp = fopen($file, "r");
fseek($fp, 4);
$myint32 = fread($fp, 4);

Hier habe ich aber ein Problem. In $myint32 scheint noch nicht das
richtige zu stehen, ein (int) for fread bewirkt auch nix. Ich hab schon
eiiges rumprobiert komme aber nicht drauf. Wenn ich so nicht weiter
komme, muss ich das halt in ein php Modul packen und es mit C machen, da
weis ich wie es funktioniert.

Grüße Hans
Huber Hans [ Di, 08 April 2008 23:17 ] [ ID #1938208 ]

Re: Binärfile auslesen

Huber Hans schrieb:

> Ich nutze fopen um die Datei zu öffnen, in etwa so:
>
> $fp =3D fopen($file, "r");
> fseek($fp, 4);
> $myint32 =3D fread($fp, 4);

Hier hast du genau die Zahl als Binärzahl in 4 Character verpackt.
Anders als bei C interpretiert das Casten nach int in PHP die 4 Bytes
als String und nicht als Binärzahl.

$fp =3D fopen( $file, 'r' );
fseek( $fp, 4 );
$bytes =3D fread( $fp, 4 );

$myInt32 =3D 0;
for ( $i=3D0; $i<4; $i++ ) {
$myInt32 =3D $myInt32*256 + ord( $bytes[$i] );
}

dürfte tun, was du brauchst (ungetestet, HiLo vorausgesetzt).

MfG
Niels

--
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------
Niels Braczek [ Di, 08 April 2008 23:29 ] [ ID #1938210 ]

Re: Binärfile auslesen

Niels Braczek schrieb:
> Huber Hans schrieb:
>
>> Ich nutze fopen um die Datei zu öffnen, in etwa so:
>>
>> $fp = fopen($file, "r");
>> fseek($fp, 4);
>> $myint32 = fread($fp, 4);
>
> Hier hast du genau die Zahl als Binärzahl in 4 Character verpackt.
> Anders als bei C interpretiert das Casten nach int in PHP die 4 Bytes
> als String und nicht als Binärzahl.

Daher
>
> $fp = fopen( $file, 'r' );
> fseek( $fp, 4 );
> $bytes = fread( $fp, 4 );
>
> $myInt32 = 0;
> for ( $i=0; $i<4; $i++ ) {
> $myInt32 = $myInt32*256 + ord( $bytes[$i] );
> }

Ohne es jetzt getestet zu haben, klingt plausibel, werde es Morgen mal
auf meine Datenfiles loslassen.

Danke, Hans
>
> dürfte tun, was du brauchst (ungetestet, HiLo vorausgesetzt).
>
> MfG
> Niels
>
Huber Hans [ Di, 08 April 2008 23:31 ] [ ID #1938211 ]

Re: Binärfileauslesen

Niels Braczek <nbraczek [at] freenet.de> wrote in
news:ftgo0l$q2a$02$1 [at] news.t- online.com:

> Huber Hans schrieb:
>
> $fp = fopen( $file, 'r' );
> fseek( $fp, 4 );
> $bytes = fread( $fp, 4 );
>
> $myInt32 = 0;
> for ( $i=0; $i<4; $i++ ) {
> $myInt32 = $myInt32*256 + ord( $bytes[$i] );
> }

Da es sich bei $bytes um einen String handelt, sollte mit $bytes{$i}
und nicht mit $bytes[$i] zugegriffen werden.

http://de2.php.net/manual/de/language.types.string.php#langu age.types.strin
g.substr

Gruß
David
David Fuhr [ Mi, 09 April 2008 08:48 ] [ ID #1938981 ]

Re: Binärfile auslesen

David Fuhr schrieb:
> Niels Braczek <nbraczek [at] freenet.de> wrote in

> Da es sich bei $bytes um einen String handelt, sollte mit $bytes{$i}
> und nicht mit $bytes[$i] zugegriffen werden.

Das ist Schnee von gestern. Die PHP-Entwickler haben in diesem Punkt
zurückgerudert. [] ist jetzt die korrekte Notation.

> http://de2.php.net/manual/de/language.types.string.php#langu age.types.s=
trin
> g.substr

Deshalb liest man das Original:

http://www.php.net/manual/en/language.types.string.php#langu age.types.str=
ing.substr

MfG
Niels

--
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------
Niels Braczek [ Mi, 09 April 2008 09:00 ] [ ID #1938982 ]

Re: Binärfileauslesen

Niels Braczek <nbraczek [at] freenet.de> wrote in
news:fthpfr$the$01$1 [at] news.t-online.com:

> David Fuhr schrieb:
>> Niels Braczek <nbraczek [at] freenet.de> wrote in
>
>> Da es sich bei $bytes um einen String handelt, sollte mit $bytes{$i}
>> und nicht mit $bytes[$i] zugegriffen werden.
>
> Das ist Schnee von gestern. Die PHP-Entwickler haben in diesem Punkt
> zurückgerudert. [] ist jetzt die korrekte Notation.
>
> Deshalb liest man das Original:
>
> http://www.php.net/manual/en/language.types.string.php#langu age.types.s
> tring.substr

Oh, ok.. danke ^^
David Fuhr [ Mi, 09 April 2008 11:46 ] [ ID #1938990 ]

Re: Binärfileauslesen

Huber Hans wrote:

Hallo,

> ich hab ein Binärfile bei dem ich gerne ganz simpel und einfach zur=

> Erkennung des Formats einen Wert auslesen möchte. Leider komme ich =
auf
> die Schnelle nicht drauf, wie ich z.B. den Int32 der sich dort(von By=
te
> 5-8) befindet in einen String wandle.

Das sollte mit unpack() gehen, was auch Big und Little Endian unterstü=
tzt.

Allerding kennt PHP nur vorzeichenbehaftete Integer, so dass
Werte größer als 2 Mrd. und ein bißchen als negative Zahl zurüc=
kgegeben
werden. Die User Contributed Notes gehen aber darauf auch ein.


tschuess
[|8:)
Sven Drieling [ Mi, 09 April 2008 14:27 ] [ ID #1938993 ]

Re: Binärfile auslesen

Huber Hans schrieb:

> ich hab ein Binärfile bei dem ich gerne ganz simpel und einfach zur
¯¯¯¯¯¯¯¯¯

> $fp = fopen($file, "r");
¯¯¯

$fp = fopen($file, "rb");

Den Rest haben andere schon beantwortet.

Gruß. Claus
Claus Reibenstein [ Mi, 09 April 2008 18:09 ] [ ID #1939002 ]
PHP » de.comp.lang.php.misc » Binärfile auslesen

Vorheriges Thema: EZComponents DatabaseSchema - XML-Format
Nächstes Thema: Rechnen mit php